gifts2017

Проблемы повторного использования кода в системе 1С:Предприятие 7.7 на примере процедуры ввода на основании

Опубликовал Олег Чалаев (OlegTor) в раздел Программирование - Практика программирования

Какой же это замечательный механизм - ввод одного документа на основании другого. Да вот работает он хорошо только интерактивно - нажал пользователь кнопочку и вот, готов новый подчиненный данному документ.
Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы...
Какой же это замечательный механизм - ввод одного документа на основании другого. Да вот работает он хорошо только интерактивно - нажал пользователь кнопочку и пожалуйста, готов новый подчиненный данному документ.
Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы.

Первая проблема состоит в том, что во встроенном языке 1С всего одна процедура, которая инициирует выполнение предопределенной процедуры <ВводНаОсновании>, прописанной в модуле формы документа.
Речь идет о процедуре <ОткрытьФорму> ввода нового документа, последним параметром этой процедуры является документ-основание.

Вторая проблема носит более глобальный характер и связана с ориентацией встроенного языка 1С не на объектно-ориентированную, а на процедурную технологию программирования. Если говорить конкретно, то стандартными способами нельзя вызывать методы, написанные разработчиком в модуле формы объекта, в других местах, лежащих вне контекста данного объекта.
Короче говоря, нельзя расширить стандартный набор методов объекта.

Отсюда напрямую вытекает проблема повторного использования кода. Сколько раз приходилось иметь дело (особенно в типовых конфигурациях) с тем, что некая процедура, гармонично работающая в конфигурации, должна быть использована где-то еще, но увы...

Хорошо конечно, если автор(ы) конфигурации позаботился о возможности повторного использования кода и написал в Глобальном модуле процедуры или функции с волшебным словом "Экспорт". Однако так бывает достаточно редко.

Итак, вернемся к проблеме группового ввода документов на основании.

Допустим, каким-то образом мы идем по выборке документов одного вида и вводим подчиненные документы, например:

ДокРеализация = СоздатьОбъект("Документ.Реализация");
ДокРеализация.ВыбратьДокументы(НачДата,КонДата);

Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл
   ОткрытьФорму("Документ.СчетФактура",,ДокРеализация);
КонецЦикла;


Но, при выполнении данного кода откроется форма заполненного на основании "Реализации" документа "СчетФактура" и при сохранении запишется только первый "СчетФактура". Для остальных даже не откроются формы.

Для того, чтобы избежать этого, в модуле формы документа "СчетФактура" в процедуре <ПриОткрытии> можно написать следующий код:

Процедура ПриОткрытии()
   //...
   Если Форма.Параметр = "ВводНаОсновании" Тогда
      Попытка
         Записать();
      Исключение
         Сообщить("Ошибка записи документа " + Вид() + " № " + НомерДок + " от " + ДатаДок);
      КонецПопытки;

      СтатусВозврата(0);
      Возврат;
   КонецЕсли;
   //...
КонецПроцедуры


Также необходимо исправить и обхода документов в цикле:

ДокРеализация = СоздатьОбъект("Документ.Реализация");
ДокРеализация.ВыбратьДокументы(НачДата,КонДата);

Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл
   Конт = "ВводНаОсновании";
   ОткрытьФорму("Документ.СчетФактура",Конт,ДокРеализация);
КонецЦикла;


При таком подходе сначала будет выполняться процедура "ВводНаОсновании" модуля формы документа "СчетФактура", а затем процедура "ПриОткрытии", в которой анализируется переданный в форму параметр, и при его соответствующем значении осуществляется запись документа и отмена открытия его формы.

Вот и все.

Следует отметить, что место вставки кода в процедуру <ПриОткрытии> зависит от того, какие действия в ней осуществляются. Если присваиваются значения реквизитов, то код вставляется после этих действий.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. VasilyKushnir (vasilykushnir) 18.08.06 11:39
А где набор? Как я понял формируется только Документ.СчетФактура. А если зараннее известно, какой документ должен быть сформирован на основании Документ.Реализация, то смыл огород городить? У меня, например, на основании ВедомостьИнвентаризаци (одного документа) может формироватся до 70 (бывает и больше - зараннее сам не знаю, от количества позиций зависит) документов ЛистИнвентаризации. И все релизовано предельно просто. Другое дело, если на основании ПриходнаяНакладная надо сформировать до 5 документов Перемещение (на склады хранения), НалоговаяПоПриходу и при необходимости ВозвратПоставщику - уже чуть посложнее, но опять же реализуемо: СоздатьДокумент-Заполнить-Записать. При необходимости можно каждый из перед сохранением и открыть (для проведения - автоматом проводить не рискнул).
2. Олег Чалаев (OlegTor) 18.08.06 11:52
Пример, я привел проще некуда. Возможно он не отражает основные идеи статьи.

Естественно, схема "СоздатьДокумент-Заполнить-Записать" будет работать всегда, да вот только реализацию этапа "Заполнить" зачастую приходится выполнять заново, хотя в модуле формы документа она уже прописана.

Всетаки, основной круг вопросов статьи - проблемы повторного использования кода.
Надо было так и назвать ее "Проблемы повторного использования кода".
3. VasilyKushnir (vasilykushnir) 18.08.06 12:21
>Проблемы повторного использования кода

Согласен и
+1
4. Сhe Burashka (CheBurator) 18.08.06 14:53
Ну тогда уж написать
Попытка Записать()
Исключение
//хз... нумератор кривые руки/алгоритмы накосячили...
КонецПопытки;
5. Олег Чалаев (OlegTor) 18.08.06 15:27
Верное замечание.
Всякое может быть в "черном ящике"...

Потому исправляюсь.
6. kairat primbetov (karat60) 07.09.06 20:18
7. batys (batys) 21.12.09 08:15
Плюсану. Возникла похожая задача, поиском нашел статью и съэкономил время. Спасибо
8. Jktu Hjkty (vitus) 16.10.14 12:26
Полная лажа. В 2014 году, чтобы программно заполнить документ, я вношу изменения в типовую конфигурацию, чтобы сделать процедуру заполнения экспортной. Но благодаря этому я понял почему 1С ников не любят "труъ" программисты. Потому что у людей, которые стоят во главе всей этой жёлтой вакханалии, мышление скорее бухгалтерское, а не техническое.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа