Рассылка закрыта
При закрытии подписчики были переданы в рассылку "В помощь бухгалтеру" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
1С: грабли, камни и бриллианты
Информационный Канал Subscribe.Ru | Новый модный поиск - www.lycos.ru |
Здравствуйте, уважаемые! Вашему взору представлена рассылка "1С: грабли, камни и бриллианты" и я ее ведущий Кружаев Валерий krug@tula.net Выпуск 12. Ежедневный доступ к интернету организовать удалось. Правда только по вечерам. ______________________________________________________________________________ Уважаемый Валерий! С удовольствием читаю Вашу рассылку. Не могли бы Вы подробнее объяснить, как в процедурах и функциях передаются параметры, что означает: по ссылке, по значению, по умолчанию, что за формальные параметры. Если возможно, то дайте пожалуйста примеры. Заранее спасибо. Слава. -------------------------------------------------------- Передача параметра по ссылке означает, что в процедуру передается не сам параметр, а его адрес. Это позволяет изменять параметр и не заботиться о возврате значения, поскольку и внутри и снаружи процедуры мы получаем доступ к одному и тому же объекту. Передача параметра по значению, т.е. самого значения подразумевает, что система копирует объект и мы работаем с копией. В этом случае эту копию нужно явно возвращать. Эти два вида передачи параметров являются классическими и используются практически во всех современных языках программирования. Другой вопрос - чему отдать предпочтение в каждом конкретном случае. Если передаваемый для обработки параметр просто огромный, вряд ли имеет смысл передавать его по значению и напрягать тем самым память и другие ресурсы компьютера. Вообще что касается 1С - там все немного по-другому организовано. И разобраться с тем, что передается по ссылке, а что по значению, проще всего поэкспериментировав. Но поскольку конкретный кусок кода однозначно содержит только один модуль, то гораздо проще не загружаться такими тонкостями. Если, к примеру, вам нужно передать какой-то список значений для обработки в процедуру, а она его только читает, но не изменяет, как обычно и происходит, объявляйте этот список в вызывающей процедуре (напомню, что объявление происходит автоматически при присвоении какого-то значения для обычных переменных и с помощью метода СоздатьОбъект("ТипОбъекта") для агрегатных типов данных. А тот объект, который вы поместили в экранную форму - уже объявлен. А если вам нужно иметь доступ к объекту из нескольких процедур - объявите его в начале модуля и его область видимости распространится на весь модуль. Тогда его можно инициализировать каким-то значением в одном месте и использовать его не передавая в другом. Я это использую, в частности когда у меня используется какой-то элемент справочника в обработке постоянно. Т.е. мы оперируем областью видимости переменной. Объявил его сверху, при открытии нашел и присвоил, а потом любая процедура его видит. Кстати, по поводу объектов 1С есть одна тонкость, о которой следует знать во избежание недоразумений. Я как-то об этом уже упоминал. Когда вы создаете некий агрегатный объект, например справочник, то имя этого объекта является ссылкой на объект. А когда вы выберете конкретный элемент справочника, к нему можно обращаться по именам его реквизитов. Но неправильно передавать для обработки имя объекта, подразумевая конкретную позицию. Например, Спр = СоздатьОбъект("Справочник.Номенклатура"); Спр.НайтиПоНаименованию("Нужное наименование",0,0); Если Спр.Выбран()=1 Тогда ВремЗначение = Спр; //неправильно, передается ссылка НовЗначение = Спр.ТекущийЭлемент(); //правильно, передается спозиционированное значение ВремНаименование = Спр.Наименование; //правильно, передается конкретный реквизит КонецЕсли; Обратите внимание, что теперь НовЗначение можно передавать напрямую, т.к. это УЖЕ ЗНАЧЕНИЕ, А НЕ ССЫЛКА. А если в начале модуля запишем Перем НовЗначение; мы получим доступ к этому значению из любой процедуры модуля, можем там изменять или присваивать его спокойно. Когда требуется иметь переменную, доступную из любого модуля, объявляем ее глобальной, т.е. в глобальном модуле и с приставкой Экспорт. Например, Перем глРасшифровкаПараметра Экспорт; Это можно использовать для передачи параметра в другой модуль, например, в форму справочника для подбора передавать контекст документа, который ее вызывает. Для этого в модуле формы документа напишем: глРасшифровкаПараметра = глВзятьКонтекст(Контекст); В глобальном модуле: Функция глВзятьКонтекст(Конт); Возврат Конт; КонецФункции; Эта хитрая конструкция нужна потому что Контекст нельзя присваивать напрямую переменной, он может передаваться только как параметр функции или процедуры. Можете проверить,если в документе написать глРасшифровкаПараметра = Контекст; //ошибка Теперь в процедуре ПриОткрытии модуля формы справочника для подбора пишем Если ПустоеЗначение(глРасшифровкаПараметра)=0 Тогда //извлекаем нужные данные из контекста КонецЕсли Часто эта форма содержит свою обработку внешнего параметра. Тогда нужно грамотно вклиниться с проверкой, что он не передан. внКонтекст = Форма.Параметр; Если ПустоеЗначение(внКонтекст)=1 Тогда //здесь терзаем свою переменную для передачи контекста, проверив на ее непустоту КонецЕсли; Параметры по умолчанию используются в предопределенных процедурах в виде некоторых значений, данных нам по умолчанию. Т.е. они объявлены заранее и при вызове такой процедуры уже имеют присвоенные системой значения. Например, Процедура ПриНачалеВыбораЗначения(ЭлемДиалога,ФлагСтандОбр) КонецПроцедуры; Здесь ЭлемДиалога и ФлагСтандОбр уже имеют определенное значение. Его можно изменять, присваивать. Но однажды мне понадобилось значение Флага стандартной обработки иметь к сведению в другой процедуре и я не задумываясь объявил его в начале модуля формы. Это привело к тому, что в этом месте 1С просто рушилась, выдавая что-то об ошибке работы с памятью. Потом до меня дошло, что предопределенная процедура передает через эти имена ссылки на область памяти с нужными значениями. А когда я объявил переменную с областью видимости, попадающей в область предопределенной процедуры - у меня обнаруживаются две переменные с одним именем и разными адресами в памяти. Одну создал я, другую - программа при вызове предопределенной процедуры. Это и приводило к обрушиванию программы. Не делайте так. ______________________________________________________________________________ "Кстати, там же можно и пиктограммы в виде установленной-снятой галочки показывать. Когда мне это понадобилось, я сначала спросил у знакомых, а потом уже нашел в документации." Хотелось бы поподробнее. Спасибо. -------------------------------------------------------- Если поподробнее, то когда вы помещаете на таблицу реквизит типа текст - он становится колонкой, которую можно использовать для вывода вспомогательной информации. В частности, если всей таблице назначить стандартную картинку, состоящую из двух пиктограмм (вы легко ее найдете), то потом в этой дополнительной колонке можно установить галку использовать пиктограммы, а в поле Дополнительно задать имя функции, которая будет возвращать номер пиктограммы для отображения в зависимости от текущего значения некоторого параметра. например, однажды в документе "авансовый отчет" мне понадобилось указывать, влияет ли конкретный расход на начисление зарплаты сотрудника, который его произвел. Тогда в этой колонке, идентификатор которой "Зарпл" я указал на функцию Зарплатность(), текст которой привожу ниже: Функция Зарплатность() Если Зарплатный = 1 Тогда Возврат 2; //номер пиктограммы с установленной галочкой Иначе Возврат 1; //номер пиктограммы без галочки КонецЕсли; КонецФункции Зарплатный - это реквизит табличной части документа, который первоначально заполняется из справочника расходов. Потом добавил вот это: Процедура ПриНачалеРедактированияСтроки() Если Если Форма.ТекущаяКолонка()="Зарпл" Тогда Если Зарплатный = 1 Тогда //можно применить: Зарплатный= ?(Зарплатный=1,0,1); Зарплатный = 0; Иначе Зарплатный = 1; КонецЕсли; КонецЕсли; КонецПроцедуры После чего двойной щелчок на ячейке с пиктограммой переключал значение реквизита, ну и функция выдавала новую галочку. ______________________________________________________________________ Добрый день! Проблему печати на матричный принтер я решаю просто! Всю форму накладной сливаю в .TXT и отправка его на принтер тогда драйвер принтера сам разгребет все символы. Фаил = КаталогВременныхФайлов() + "Doc" + НомерДок + ".txt"; Текст.Записать(Файл); КомандаСистемы("copy"""+Файл+""" "+ПортПринтера); ФС.УдалитьФайл(Файл); У меня работает! Пока проблем небыло. Андрей. СПБ. ------------------------------------------------ ______________________________________________________________________ Ответ: Я бы могла взяться за перевод, Алгоритм подстановки не сложный. Сложность и потраченное время - на "набитие" базы. Но в 1С есть все английские аналоги команд. :) Пишите мне по Dina_Rachevskaya@tut.by ------------------------------------------- Весь вопрос в том, какой РЕЗУЛЬТАТ будет от такой траты времени. Кто-нибудь готов купить у Дины программу по переводу модулей на другой язык? Если такая готовность определится, то и я мог бы потратить время. Причем это можно организовать в самой 1С, имея справочник, в котором наименование - русское написание, а полное наименование - английское. А если Вас, Дина, устраивает эта задача в качестве тренировочной - дерзайте. ______________________________________________________________________ Здравствуйте все! Возникла у меня проблемка - хочу в одном документе две таблицы (т.е. строчных части) завести. А две таблицы документ в принципе не хочет вставлять, даже на разных слоях. Может кто-нибудь подкинет идею, как это попроще сделать? Заранее благодарна. Света. ------------------------------------------- А вы пропишите в форме документа таблицу значений в качестве второй таблицы, и сохраняйте ее в шапке документа в реквизите типа "Строка неограниченной длины" с помощью ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() ______________________________________________________________________ Здраствуйте. Большое неудобство в связи с отсутствием в стандартных отчетах номеров страниц. В отчетах с выборкой данных циклом можно считать строки, а как быть с отчетом на основе запроса? Можно ли добавить номера страниц в отчет , формируемый запросом ? -------------------------------------------- Когда вы откроете таблицу, вверху в меню Таблица есть подменю колонтитул, там можно указать отдельно для верхнего и нижнего колонтитулов шаблон. Например, в текстовом поле нижнего колонтитула пишем: остатки товаров, страница № #P что приведет к распечатке внизу каждой страницы текста остатки товаров, страница № 1 и т.д. Там же даты, время и прочее можно подставлять. Подробнее см. в документации. _____________________________________________________________________ Здравствуйте Валерий. Проблема в следующем . Есть сетевая версия 1С:Предприятие 7.7 . База находится на одной из рабочих станций в одноранговой сети Windows. Одновременно с базой может работать только 2 пользователя . Можно ли увеличить число одновремеено работающих с базой . -- С уважением, Никандров --------------------------------------------- win98 может открыть только 1024 файла, а "увесистая" конфигурация их содержит штук 400. Так что посчитайте, сколько пользователей сработает. Поставьте win с ядром NT, там файлов открывается вроде неограниченное количество. ____________________________________________________________________ Здравствуйте! Подскажите, пожалуйста, как в 1С: Предприятии удалить все документы безвозвратно за большой период времени (предположим за год)? Sels. sels@pisem.net --------------------------------------------- Создаем внешнюю обработку. Там пишем: Процедура Сформировать() док = СоздатьОбъект("Документ"); ДатаС = '01.01.01'; ДатаПо = '31.12.01'; док.ВыбратьДокументы(ДатаС,ДатаПо); пока док.получитьДокумент()=1 Цикл док.Удалить(0); КонецЦикла; КонецПроцедуры; Не делайте непосредственное удаление (док.Удалить(1)), т.к. работает гораздо дольше. Лучше помеченные на удаление документы потом стандартными средствами удалить. И не забудьте потом базу упаковать. Ну вот вроде и всё сказал на сегодня. Пишите мне о том, что вы хотели бы знать, но стеснялись спросить :) Приветствуются все предложения, пожелания, а также ругательства в мой адрес. Только хочу предупредить, что во избежание недоразумений ваши письма должны иметь явное указание на разрешение или запрещение публикации их в рассылке. По умолчанию считается, что письмо публиковать разрешено. Если вы в теле письма указали адрес, я буду его тоже указывать. Но специально из реквизитов письма адрес извлекаться не будет. Это нормально и общепринято. Не так ли? Впрочем, как известно, известные люди имеют в своем использовании больше денежных знаков... Так что решать вам, светиться или отсиживаться. До встречи, господа! Написать ведущему krug@tula.net Адрес рассылки: http://subscribe.ru/catalog/inet.review.cool1c Архив рассылки: http://subscribe.ru/archive/inet.review.cool1c
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||