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

18.08.06

Разработка - Механизмы платформы 1С

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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


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

Вот и все.

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

См. также

"Виртуальный" работник на платформе 1C v7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.

28.11.2021    1545    user707242_Gold_karas    18    

5

Асинхронное программирование в 1с77 без внешних компонент. Обратные вызовы.

Механизмы платформы 1С Платформа 1С v7.7 Абонемент ($m)

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7445    Vortigaunt    5    

11

Особенности разделения объектной модели документа и базы данных в 1С 7.7. Забавный глюк

Механизмы платформы 1С Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10128    Vortigaunt    26    

5

Использование классов .Net в 1С для новичков

Механизмы платформы 1С Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    93974    Serginio    116    

188

Все про картинки в 1С 7.7, ну или почти все...

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    43977    95    kitminsk    18    

20

ЗаполнитьЗначенияСвойств - заставляем работать в 7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    23722    tomvlad    5    

14

Динамическая фильтрация в справочнике при вводе наименования

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Позволяет в открытой форме списка, выбора или подбора справочника производить динамическую фильтрацию по набранному наименованию.

02.07.2012    18359    maxpiter    62    

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

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

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

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

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