Схема проведения документов в типовых конфигурациях УТ 11, ERP 2 и КА 2

В этой статье мы разберем схему проведения документа по регистрам в типовых конфигурациях УТ 11, КА 2 и ERP 2.

Для чего это нужно?

  • Доработка проведения документов по существующим и новым регистрам встречается на любом серьезном проекте.
  • Другой тип задач – разобраться, почему документ формирует те или иные движения.

    Нередко в документации написано одно, а по факту всё работает иначе. И приходится уходить в отладку, разбираться с общими модулями и стеком из десятка вложенных вызовов.

Что конкретно будем рассматривать

Мы разберем алгоритмы типовых конфигураций – и научимся быстро отлаживать и дорабатывать универсальные механизмы проведения документов тиражных решений фирмы 1С.

В результате Вы будете знать ответы на вопросы:

  • Где находятся алгоритмы формирования движений?
  • Как изменить типовое проведение документа?
  • Как адаптировать документ для движений по собственному регистру?

Для ответа на поставленные вопросы, без «длительного копания в тоннах типового кода» и быстрого получения результата, необходимо знать схему проведения документа.

А что самое приятное – почти все типовые документы проводятся по одинаковой схеме, неважно, реализация это, приходный кассовый ордер или план закупок.
Поэтому, изучив общую схему, Вы сможете доработать любой документ. :)

Схема проведения документа

Укрупненно проведение документа происходит в два этапа, первый этап – подготовка и запись данных, второй этап – контроль отрицательных остатков.

Можно сделать вывод, что в схеме проведения документа используется новая методика контроля остатков, когда сначала формируются движения, а затем проверяется допустимость сформированных движений.

Дополнительно о методиках контроля остатков можно прочитать в другой нашей статье: https://курсы-по-1с.рф/articles/2017-02-12-two-methods-for-inventory-check/

Театр начинается с вешалки, а проведение документа – с процедуры ОбработкаПроведения() модуля объекта. Порядок действий в обработке проведения документа можно представить в виде следующей схемы:

Рисунок 1. Схема действий обработки проведения документа

Рассмотрим детально каждую точку алгоритма проведения на примере документа «Реализация товаров и услуг».

1. Инициализация дополнительных свойств для проведения

ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства, РежимПроведения);

Вызывается процедура ИнициализироватьДополнительныеСвойстваДляПроведения() общего модуля ПроведениеСервер, в процедуру кроме ссылки и режима проведения передаются ДополнительныеСвойства.

ДополнительныеСвойства – свойство объекта документ, структура, которая может хранить некоторые значения, связанные с объектом, без изменения объекта.

Свойство доступно для изменения не только в обработке проведения, но и прочих обработчиках модуля объекта, и это свойство доступно, пока существует объект. Например, можно в обработчике перед записью поместить в это свойство некоторые данные и затем воспользоваться ими в обработке проведения.

В вызываемой процедуре инициализируются общие для всех документов структуры (ДляПроведения и ТаблицыДляДвижений), используемые при проведении документов.

Рисунок 2. Дополнительные свойства после инициализации

Один из ключей ТаблицыДляДвижений – структура, которая будет содержать таблицы значений с данными для выполнения движений, или, проще говоря, готовые наборы движений документа.

2. Заполнение дополнительных свойств для проведения

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

Вызывается процедура ИнициализироватьДанныеДокумента() модуля менеджера объекта, в процедуру передается ссылка на объект и ДополнительныеСвойства.

Документы.РеализацияТоваровУслуг.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);

После завершения работы процедуры каждый ключ структуры ТаблицыДляДвижений содержит таблицу значений с будущими движениями регистра.

Рисунок 3. Таблицы движений регистров в структуре дополнительных свойств

Обратите внимание, что ключи структуры названы по шаблону Таблица[Вт][ИмяРегистраДляДвижения], где Вт – признак временной таблицы, а ИмяРегистраДляДвижения – наименование регистра, куда будут записаны движения из таблицы значений.

Процедура инициализации – это несколько шагов, каждый из которых требует рассмотрения.

 ////////////////////////////////////////////////////////////////////////////
 // Создадим запрос инициализации движений
	
 Запрос = Новый Запрос;
 ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
	
 ////////////////////////////////////////////////////////////////////////////
 // Сформируем текст запроса
	
 ТекстыЗапроса = Новый СписокЗначений;
 ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);
 ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);
 ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
 ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры);
 ...
	
 ////////////////////////////////////////////////////////////////////////////
 // Скомпонуем текст запроса и выполним его
	
 ПроведениеСервер.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, 
			ДополнительныеСвойства.ТаблицыДляДвижений, Истина);

Рассмотрим детально, что происходит в модуле менеджера объекта при вызове процедуры инициализации.

2.1. Заполнение параметров запроса
Запрос = Новый Запрос;
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);

Создается объект запрос и формируются параметры будущего запроса по полученной ссылке на документ. Все параметры запроса, которые пригодятся для исполнения текста запроса, устанавливаются методом УстановитьПараметр().

2.2. Формирование текстов запросов
ТекстыЗапроса = Новый СписокЗначений;
ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры);

Создается список значений ТекстыЗапроса, который будет содержать тексты запроса. Для каждого регистра, по которому требуется сформировать движения, вызывается процедура ТекстЗапросаТаблица[ИмяРегистраДляДвижения], где ИмяРегистраДляДвижения – наименование регистра, для которого формируется таблица движений. Текст запроса добавляется в список значений ТекстыЗапроса.

Вот и ответ на вопрос: «Где находятся алгоритмы формирования движений?».

Именно в процедуре ТекстЗапросаТаблица[ИмяРегистраДляДвижения] содержится текст запроса, на основании которого будут сформированы движения документа в конкретный регистр учетной системы.

2.3. Получение результата запроса
ПроведениеСервер.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);

Список значений ТекстыЗапроса передается в процедуру ИнициализироватьТаблицыДляДвижений() общего модуля ПроведениеСервер, в процедуре производится компоновка общего текста пакетного запроса по данным списка значений и его выполнение. Затем процедура выгружает результаты запроса в таблицы значений, в свойство ТаблицыДляДвижений, рассмотренное на первом шаге.

3. Подготовка наборов записей документа к записи движений

ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

Будущие движения сформированы и уже хранятся в структуре ДополнительныеСвойства, теперь требуется подготовить регистры к записи. Процедура взводит флаг записи у наборов записей, по которым документ имеет движения, при этом контролируются ИсключаемыеРегистры – регистры, движения по которым формируются не из модуля менеджера документа.

Например, документ реализации формирует движения по регистру «РасчетыСКлиентамиПоДокументам», но не в момент проведения, а в дальнейшем, при помощи регламентного задания, следовательно, регистр «РасчетыСКлиентамиПоДокументам» будет помещен в исключаемые и флагу записи останется присвоенное значение «Ложь».

4. Заполнение движений наборами записей

ЗаказыСервер.ОтразитьЗаказыКлиентов(ДополнительныеСвойства, Движения, Отказ);
ЗапасыСервер.ОтразитьСвободныеОстатки(ДополнительныеСвойства, Движения, Отказ);
ЗапасыСервер.ОтразитьОбеспечениеЗаказов(ДополнительныеСвойства, Движения, Отказ);
ЗаказыСервер.ОтразитьТоварыКОтгрузке(ДополнительныеСвойства, Движения, Отказ);

На этом этапе для каждого регистра таблицы значений с движениями выгружаются из дополнительных свойств в наборы записей регистров. Загрузка движений по каждому из регистров производится по одинаковому алгоритму, таблица движений из дополнительных свойств загружается в движения регистра.

ТаблицаЗаказыКлиентов = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаЗаказыКлиентов;
…
ДвиженияЗаказыКлиентов.Загрузить(ТаблицаЗаказыКлиентов);

Результаты ранее выполненных запросов перенесены из таблиц значений в движения. Осталось только записать движения документа – рассмотрим это на следующем шаге.

5. Запись движений документа

ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);

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

Объект.Движения.Записать();

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

6. Контроль отрицательных остатков

Движения записаны, настало время проверки результатов проведения.

Вызывается процедура СформироватьСписокРегистровДляКонтроля(), свойства объекта дополняются массивом РегистрыДляКонтроля. По каждому из регистров, находящихся в массиве, будет проведен контроль, за контроль отвечает процедура общего модуля:

ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ);

В случае выявления несоответствий флаг Отказ будет возведен в «Истину» и проведение документа будет завершено с соответствующим диагностическим сообщением.

7. Очистка дополнительных свойств для проведения

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

ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);

8. Дополнительные действия проведения

Завершающий этап обработки проведения документа. Выполняются дополнительные действия, связанные с объектом, и эти действия должны быть неразрывно связаны с моментом проведения документа, т.е. выполнены в транзакции проведения. Например, для документа реализации это актуализация счета-фактуры (приведение состояния счета-фактуры в соответствие с документом-основанием) и регистрация документа продажи, если по нему необходим счет-фактура.

Документы.СчетФактураВыданный.АктуализироватьСчетФактуру(ЭтотОбъект, Истина, ТребуетсяСчетФактура());
РегистрыСведений.ТребуетсяОформлениеСчетаФактуры.ОтразитьНеобходимостьОформленияСчетаФактуры(ДополнительныеСвойства, Отказ);

Документ реализации является сложным случаем и имеет дополнительные действия. В простом случае проведения дополнительных действий может и не быть.

Заключение

В статье рассмотрена схема проведения документа по регистрам учета в типовых конфигурациях УТ 11, КА 2 и ERP 2. Подведем краткие итоги:

Как понять алгоритм формирования движений в определенный регистр?

Алгоритм формирования движений содержится в тексте запроса, который расположен в функции ТекстЗапросаТаблица[ИмяРегистраДляДвижения] модуля менеджера объекта.

Как изменить алгоритм формирования движений в определенный регистр?

Требуется разработать свой текст запроса и поместить его вместо существующего в функцию ТекстЗапросаТаблица[ИмяРегистраДляДвижения] модуля менеджера объекта.

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

Как добавить формирование движений в свой новый регистр?

Требуется разработать текст запроса, формирующий движения, и поместить его в новую, нами созданную, функцию ТекстЗапросаТаблица[ИмяСвоегоНовогоРегистра] модуля менеджера объекта.

В модуле объекта добавить вызов процедуры Отразить[ИмяСвоегоНовогоРегистра] в обработке проведения документа. Текст процедуры формируется по аналогии с типовыми процедурами.

Как провести документ только по одному регистру?

Рассмотрим эмпирическую задачу: нам требуется провести документ реализации только по одному регистру накопления, например, «Свободные остатки». Достаточно создать внешнюю обработку и разместить в ней следующий программный код:

&НаСервереБезКонтекста
Процедура ПерепровестиДокументРеализацииПоРегиструСвободныеОстатки(РеализацияСсылка, Отказ)
 
	РеализацияОбъект = РеализацияСсылка.ПолучитьОбъект();
ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(РеализацияСсылка, РеализацияОбъект.ДополнительныеСвойства, РежимПроведенияДокумента.Неоперативный);
      	Документы.РеализацияТоваровУслуг.ИнициализироватьДанныеДокумента(РеализацияСсылка, РеализацияОбъект.ДополнительныеСвойства);
        	ЗапасыСервер.ОтразитьСвободныеОстатки(РеализацияОбъект.ДополнительныеСвойства, РеализацияОбъект.Движения, Отказ);
        	РеализацияОбъект.Движения.Записать();
        	
КонецПроцедуры // ПерепровестиДокументРеализацииПоРегиструСвободныеОстатки()

Эта тема детально раскрыта в курсе:

Доработка и Адаптация типовых конфигураций УТ 11, ERP 2 и КА 2

Поддержка – 3 месяца. Объем курса – 32 часа видеоуроков.

Описание курса

Об авторе

Автор статьи – Вячеслав Вязигин

E-mail: v.v.vyazigin@mail.ru

Skype: vvyazigin

VK: https://vk.com/vvyaz

Вячеслав Вязигин – тренер курса «Доработка и Адаптация типовых конфигураций УТ 11, 1С:ERP 2 и КА 2»

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.


Статья в PDF-форматеСтатья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

Комментарии / обсуждение (29):

  1. SinO

    Добрый день! Подскажите пожалуйста, а как откорректировать программно сумму проводки в КА 2.5, там совсем все по другому, точнее сказать не как, а в каком месте? Куда копать? В какой процедуре можно прочитать набор движений регистра бухгалтерии? Пытался как к примеру в БП 3.0 в подписке на событие, но в КА не получается.

  2. ninch

    Добрый день. Подскажите, а продолжения нет – как формируются бух проводки (отражение в регл. учете)?

    • Кузьмин Сергей

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

  3. Марк

    Здравствуйте!

    Помогите пожалуйста с реализацией задачи. Необходимо реализовать создание Заказа клиента на основании документа Плана продаж, при этом заказать можно только ту номенклатуру, которая есть в Плане продаж и количество в Заказе не должно превышать количества в Плане продаж. И еще присутствует такая особенность, у каждой номенклатуры есть основная номенклатура, у разной номенклатуры может быть одинаковая основная номенклатура. В Заказе клиента (созданного на основании Плана продаж) необходимо реализовать возможность заменять номенклатуру на ту у которой одинаковая основная номенклатура, при этом должен так же работать контроль количества, т.е. нельзя заказать больше чем указано в плане продаж. Вопрос в том как это все правильно реализовать? Для контроля остатков лучше наверное создать регистр накопления, но из каких измерений должен состоять этот регистр и какую номенклатуру в этот регистр писать, брать основную номенклатуру или как в табличной части записывать набор?

    • Ольга Шапкина

      Добрый день!
      Создайте регистр накопления остатков, в качестве измерения возьмите номенклатуру (тип данных же одинаковый у исходной номенклатуры и основной). В качестве регистраторов укажите документ План продаж и Заказ клиента. Вы приход количества будете регистрировать не по основной номенклатуре, а по исходной номенклатуре из ТЧ документа План продаж, значит Расход – по исходной номенклатуре ТЧ документа Заказ клиента (сгруппируйте данные по номенклатуре перед записью в регистр).

  4. kolshik

    А как можно отладить запрос ВтТаблицаТовары? Если он берет данные левым соединением из других временных таблиц, видимо полученных чуть раньше?

  5. msadu

    Добрый день!
    Как вывести сумму а регистре накопления, добавлял несколько реквизитов в регистре “РасчетСебестоимости, ХозяйственнаяОперация, ДокументДвижения”, но не помогло расчетом суммы ?

    • Вячеслав Вязигин

      День добрый!

      Не совсем понятно откуда и куда Вы хотите вывести сумму, уточните вопрос.

  6. rmarkovych

    Здравствуйте!
    УТ11 + CRM.
    Хочу добавить движения документа “Чек ККМ” в Регистры “Расчеты с клиентами” и “Расчеты с клиентами по документам”.
    По Вашей статье сделал, что записи в первый регистр записываются.
    А вот как делаются записи в другой регистр, например, Приходным кассовым ордером – не нашел.
    Если делать принудительно (по аналогии с первым регистром), то записи делаются без заполнения поля “Расчетный документ”.
    Помогите разобраться, пожалуйста!!!

    • rmarkovych

      Решил. Все дело было в Определяемом типе Измерения регистра.
      Еще раз спасибо за статью!!!

  7. noTeMkuH

    Здравствуйте. Спасибо за статью ! Не подскажете – по такому же алгоритму можно делать движения в регистрах, с независимым режимом записи (не подчиненным никакому регистратору) ? А также – как делать отмену проведения по таким регистрам ? Предусмотрены ли для этого механизмы в общих модулях ?

    • Вячеслав Вязигин

      День добрый!

      Да, таким же образом можно формировать движения в регистрах без регистратора, никаких ограничений платформа на этот счет не накладывает.

      Для отмены проведения Вам понадобится скорректировать процедуру ОбработкаУдаленияПроведения() с собственным алгоритмом очистки движений, т.к. типовые механизмы опираются на коллекцию движений объекта, которая ничего не знает о движениях в независимом регистре.

  8. Максим

    Здравствуйте. Статья отличная, но не раскрыта тема доработки проведения через подписки на события. В частности я планировал добавить в документ реализация дополнительные движения по регистру РасчетыСКлиентами. В подписке ОбработкаПроведения я получил данные, добавил из в набор записей регистра, все как по нотам, но эти записи, в итоге, не записываются. Вот пример кода:
    ТаблицаРасчеты = З.Выполнить().Выгрузить();

    Если Отказ ИЛИ ТаблицаРасчеты.Количество() = 0 Тогда
    Возврат;
    КонецЕсли;

    ДвиженияРасчеты = Источник.Движения.РасчетыСКлиентами;

    Для каждого Стр Из ТаблицаРасчеты Цикл
    Если Стр.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
    СтрДвижений = ДвиженияРасчеты.ДобавитьПриход();
    ИначеЕсли Стр.ВидДвижения = ВидДвиженияНакопления.Расход Тогда
    СтрДвижений = ДвиженияРасчеты.ДобавитьРасход();
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(СтрДвижений,Стр);
    КонецЦикла;

    ДвиженияРасчеты.Записывать = Истина;

    после чего выдается ошибка в процедуре ПередЗаписью в модуле НабораЗаписейРегистра…

    Не установлен менеджер временных таблиц

    • Вячеслав Вязигин

      День добрый!

      По представленной Вами информации невозможно диагностировать по какой причине происходит ошибка исполнения кода, очень мало данных.

      Тема адаптации конфигурации, в том числе механизмов проведения, очень подробно раскрыта в материалах курса, все уместить в статью невозможно :)

  9. Николай

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

    • Вячеслав Вязигин

      День добрый!

      Ваше утверждение на сегодняшний день некорректно. Обращение к результатам запроса по номерам присутствовало в старой редакции УТ.

      На сегодняшний день обработка пакетного запроса идет не по индексу, а по текстовому представлению (имени регистра). Использование временных таблиц допустимо и широко применяется на практике.

      // Процедура компонует текст запроса, выполняет запрос и выгружает результаты запроса в таблицы.
      //
      // Параметры:
      //  Запрос                     - Запрос  - запрос, параметры которого предварительно установлены.
      //  ТекстыЗапроса           - СписокЗначений  - в списке перечислены тексты запросов и их имена.
      //  Таблицы                   - Структура        - структура в которую будут помещены полученные таблицы для движений.
      //  ДобавитьРазделитель       - Булево          - Истина, если нужно добавить разделитель ";" между запросами.
      //  ДобавлятьСловоТаблица   - Булево          - Истина, если к имени таблицы движений нужно вначало добавить слово "Таблица".
      //  ТолькоОтмеченные         - Булево          - признак пропуска инициализации таблицы движения.
      //
      Процедура ИницализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, Таблицы, ДобавитьРазделитель = Ложь, ДобавлятьСловоТаблица = Истина, ТолькоОтмеченные = Ложь) Экспорт
         
          ТаблицыЗапроса = ОбщегоНазначенияУТ.ВыгрузитьРезультатыЗапроса(Запрос, ТекстыЗапроса,, ДобавитьРазделитель);
         
          // Помещение результатов запроса в таблицы
          Для Каждого ТекстЗапроса из ТекстыЗапроса Цикл

              ИмяТаблицы = ТекстЗапроса.Представление;

              Если Не ПустаяСтрока(ИмяТаблицы) И (Не ТолькоОтмеченные Или ТекстЗапроса.Пометка) Тогда

                  Если ДобавлятьСловоТаблица Тогда
                      // Таблицы для проведения должны начинаться с "Таблица"
                      Если НЕ СтрНачинаетсяС(ИмяТаблицы, "Таблица") Тогда
                          ИмяТаблицы = "Таблица" + ИмяТаблицы;
                      КонецЕсли;
                  КонецЕсли;
                 
                  Таблицы.Вставить(ИмяТаблицы, ТаблицыЗапроса[ТекстЗапроса.Представление]);

              КонецЕсли;

          КонецЦикла;

      КонецПроцедуры
      • d4rkmesa

        Спустя 5 лет, конечно, бессмысленно писать. Но вы ошибались, достаточно посмотреть процедуру ОбщегоНазначенияУТ.ВыгрузитьРезультатыЗапроса. Нельзя тексты запросов использовать с временными таблицами без изрядной доработки стандартной процедуры.

  10. Аркадий Лисицин

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

    • Вячеслав Вязигин

      День добрый!

      Верно, курс детально раскрывает все рассматриваемые темы.

  11. Dubrovin

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

    • Вячеслав Вязигин

      День добрый!

      Насчет производительности не соглашусь, ну если только пострадает производительность программиста, который пытается понять, что, зачем и откуда вызывается в типовом коде)

      Код действительно становится сложнее, но это обусловлено тем, что типовые конфигурации меньшего размера (УТ, КА) «вырезаются» из монстров а-ля ERP и для этого требуется унификация и разделение объектов на подсистемы, соответственно иногда имеет место быть «жуткая лапша», но и она исчезает со временем. Есть некая избыточность, но нужно просто мыслями «быть на одной волне» с разработчиками и тогда весь кажущийся хаос выстраивается в ровную систему.

    • charushkin

      Вот не соглашусь с вами по поводу усложнения. Ровно наоборот:
      есть несколько сервисных универсальных методов (для инициализации доп. свойств, записи наборов и т.д.) + есть четкий алгоритм по формированию таблиц для движений. Все, задача прикладного программиста (модификация типовых правил проведения, разработка собственных, добавление нового документа и т.д.) становится предельно простой: напиши запрос для подготовки движений, добавь требуемые контроли результатов проведения + при необходимости допиши обработчики для дополнительных действий при проведении.

      • Вячеслав Вязигин

        День добрый!

        Все познается в сравнении, в том числе и усложнение. Код типовых конфигураций действительно становится “сложнее” по сравнению с предыдущими редакциями.

        Но курс и нужен для того, что бы все сложное стало просто)

  12. Дмитрий

    Интересная статья как и курс=) Хотелось бы услышать продолжение на примере доработки типовых решений конфигураций старого поколения. В управляемых формах есть замечательное свойство “Привилегированный режим при…”. Хотелось бы узнать есть ли какой либо готовый алгоритм по переводу процедуры проведения документов конфигураций старого поколения? Дело в том, что “привилегированный режим “решает кучу проблем с правами, да и выполнение процедур быстрее. Пока, что решаю такие вопросы локальными вставками процедур отражения по требуемым “новым регистрам” в серверном модуле (вызов сервера), но тут есть нюансы с передачей параметров (мутательных значений) и прочих деталей. Может есть какие либо общие рекомендации по модернизации процедур объектов конфигураций старого поколения или только “Рисовать управляемую форму, чтобы был вызов сервера, а не толстый клиент и адаптация всех процедур с толстого клиента на сервер?”

  13. unkas

    Отличная статья. Вот только несколько раз по тексту – “иницализировать”.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.