Отправляет email-рассылки с помощью сервиса Sendsay

1С: грабли, камни и бриллианты

  Все выпуски  

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
Рассылки Subscribe.Ru
1С: грабли, камни и бриллианты


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное