Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)

10.01.21

Разработка - Механизмы типовых конфигураций

Покажу точки входа для доработки "типового" проведения документов в ERP для регистров оперативного учета. Рассмотрим три основные ситуации: нужно изменить имеющееся проведение документа; нужно сделать записи в существующие регистры; нужно с нуля описать алгоритм проведения в добавленный регистр. Пример реализован на 1С:ERP Управление предприятием 2 (2.5.4.120)

1. Необходимо изменить имеющееся проведение документа.

Рассмотрим на примере документа "Заказ клиента". Допустим в документе изменен алгоритм определения Назначения: в шапку документа добавлен дополнительный реквизит "допНазначение" с типом СправочникСсылка.Назначения. Если этот реквизит заполнен, то в движение регистра накопления "Обеспечение заказов" должно подставляться его значение, иначе должен выполняться типовой механизм документа.

Для начала следует отметить, что для всех документов в ERP сам алгоритм Обработки проведения вынесен в общий модуль "ПроведениеДокументов".

 
 Модуль объекта документа ЗаказКлиента

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

 
 Модуль менеджера документа ЗаказКлиента

В рамках нашей задачи, нас будут интересовать функция "ТекстЗапросаТаблицаОбеспечениеЗаказов" и процедура "ЗаполнитьПараметрыИнициализации".

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

 
 Модуль менеджера документа ЗаказКлиента

Чтобы минимизировать количество таблиц базы данных, к которым идет обращение в запросе, все необходимые реквизиты "шапки" документа получаются отдельным запросом и помещаются в параметры запроса в процедуре "ЗаполнитьПараметрыИнициализации".
Определим наш добавленный реквизит как параметр запроса:

 
 Модуль менеджера документа ЗаказКлиента

На этом доработка по первому пункту статьи окончена.

2. Необходимо сделать записи в существующие или новые регистры.

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

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

 
 Структура метаданных табличных частей

 И два регистра накопления:

 
 Структура метаданных регистров

Теперь рассмотрим цепочку проведения нового документа.

В ERP проведение начинается не с процедуры ОбработкаПроведения, а с процедур ПередЗаписью и ПриЗаписи.

 
 Модуль объекта документа ДвижениеДрагметаллов

В процедуре ПередЗаписью "ДополнительныеСвойства" документа заполняются служебными значениями

 
 Общий модуль ПроведениеДокументов

В процедуре ПриЗаписи реализован механизм записи движений по независимым регистрам сведений, если документ записывается не в режиме "Проведение". Например, запись в регистр сведений "РеестрДокументов" происходит таким образом.

 
 Общий модуль ПроведениеДокументов

Давайте разберемся что такое Учетные механизмы и как их использовать.

Все регистры конфигурации (РС, РН, РР, РБ) сгруппированы в некие смысловые области - Учетные механизмы - в которых описывается по каким регистрам необходимо произвести движения, контроль движений, а также отложенные движения. Один учетный механизм может использоваться для нескольких документов. В функции "УчетныеМеханизмыКонфигурации" общего модуля "ПроведениеДокументов" хранятся все возможные механизмы конфигурации, а затем в модуле менеджера документа указывается его принадлежность к конкретным учетным механизмам.

Таким образом, чтобы выполнить запись в добавленные регистры, сперва необходимо добавить новый Учетный механизм

 
 Общий модуль ПроведениеДокументов

Добавим новый общий модуль "УчетДрагметаллов"

 
 Общий модуль УчетДрагметаллов

В функции "ПараметрыДляПроведенияДокумента" вызывается функция-конструктор "ПараметрыУчетногоМеханизма", с помощью которой определяется взаимодействие данного механизма с регистрами конфигурации.

 
 Общий модуль ПроведениеДокументов

(КонтрольныеРегистрыЗаданий - это регистры, по которым необходимо произвести отложенные движения)

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

 
 Общий модуль ЗапасыСервер (ОперативныйУчетТоваровОрганизаций)

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

 
 Общий модуль ПроведениеДокументов

 Контроль движений реализован следующий образом:

Для всех регистров, которые указаны в параметре "КонтрольныеРегистрыИзменений", в модуле набора записей регистра проверяется изменение движений ДО и ПОСЛЕ записи, чтобы не проводить "лишний" контроль.

 
 Модуль набора записей регистра накопления ОстаткиДрагметаллов

Если это первое проведение документа или данные для проведения изменились, то контроль осуществляется в модуле механизма в процедуре "ИнициализироватьДанныеКонтроляИзменений". А возведения флага отказа от проведения и сообщения пользователю описываются в модуле механизма в процедуре "СообщитьОРезультатахКонтроляИзменений".

Движение по независимым регистрам сведений рассмотрим на примере Реестра документов.

В конфигурации уже определен соответствующий Учетный механизм:

 
 Общий модуль ПроведениеДокументов
 
 Модуль менеджера регистра сведений РеестрДокументов

(Для отражения независимых регистров сведений используется экспортная процедура "ЗаписатьДанные", в отличии от зависимых регистров, где используется "ОтразитьДвижения")

Теперь, когда мы подготовили новый учетный механизм, необходимо описать его принадлежность к документу ДвижениеДрагметаллов. Дополнительно добавим движение нового документа в РС "РеестрДокументов".

 
 Модуль менеджера документа ДвижениеДрагметаллов

Также опишем получение данных для движений нового документа

 
 Модуль менеджера документа ДвижениеДрагметаллов

И наконец перейдем к процедуре "ПровестиДокумент" общего модуля "ПроведениеДокументов", из которой происходит весь процесс проведения, и разберем его подробнее:

Процедура ПровестиДокумент(Документ, Отказ, ДопПараметры)
	
    //++ Свойства мы определяли в модуле объекта документа в процедуре ПередЗаписью
    Свойства = СвойстваДокумента(Документ);

    МенеджерДокумента = Документы[Документ.Метаданные().Имя];
    ПроведениеДокументовЛокализация.ПереназначитьМодульПолученияДанныхДокумента(МенеджерДокумента);
	
    //++ Учетные механизмы документы определены в модуле менеджера в функции ЗарегистрироватьУчетныеМеханизмы
    МеханизмыДокумента    = УчетныеМеханизмыДокумента(МенеджерДокумента);

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

3. Необходимо сделать записи в существующие регистры, но имеющийся учетный механизм не подходит.

Необходимо сделать запись в независимый регистр сведений "ДокументыПоОС" из документа "ОтражениеЗарплатыВФинансовомУчете", если в качестве аналитики расходов указан Объект эксплуатации.

Нужный нам регистр отражен в учетном механизме "ОсновныеСредства":

 
 Общий модуль ОсновныеСредстваСервер

Но помимо него, там указаны регистры, которые нам использовать не требуется. Поэтому добавим новый Учетный механизм, в котором опишем движение только по РС "ДокументыПоОС":

 
 Общий модуль ПроведениеДокументов
 
 Общий модуль ДокументыПоОССервер

Осталось добавить новый механизм для документа "ОтражениеЗарплатыВФинансовомУчете" и описать получение таблицы движений

 
 Модуль менеджера документа ОтражениеЗарплатыВФинансовомУчете

 

ERP ЕРП Проведение Движения Регистр накопления сведений

См. также

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    1737    PROSTO-1C    0    

18

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:Комплексная автоматизация 2.х Россия Бесплатно (free)

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    1744    Vidz    0    

11

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1106    olja-ljaaa    0    

3

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

03.06.2024    4891    Serg2000mr    32    

108

Механизмы типовых конфигураций Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

11.04.2024    1058    tango    5    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Shmell 546 10.01.21 12:59 Сейчас в теме
Алексей, для какой версии ERP данный гайд подходит? т.к. от версии к версии (вернее к редакции) - механизмы меняются слегка...
rpgshnik; +1 Ответить
2. BuriyLesha 596 11.01.21 04:49 Сейчас в теме
(1)да, соглашусь. конкретный пример реализован на версии 1С:ERP Управление предприятием 2 (2.5.4.120). Но механизм работает и на 2.4.*
Дмитрий74Чел; Shmell; +2 Ответить
3. user705698_bursev 11.01.21 09:27 Сейчас в теме
(2) В версии 2.4.11.88 общего модуля ПроведениеДокументов просто нет. Видимо, Ваш гайд все же больше касается новых версий.
4. BuriyLesha 596 11.01.21 12:00 Сейчас в теме
(3)да, на версии 2.4.11.* проведение реализовано еще "по старому"
5. sm.artem 16 12.01.21 05:32 Сейчас в теме
Спасибо за статью! Полезный материал. Да, один в один механизм подходит для версий 2.5, в 2.4 - несколько отличается, но в целом этапы подготовки к проведению похожи
6. Hatson 536 14.01.21 10:32 Сейчас в теме
По сути дела нет смысла разбираться во всём этом, т.к. в следующем релизе всё снова переделают. Необходимо применять обычный говнокод.
user1767032; user1485340; vad7; payta; triviumfan; d4rkmesa; +6 6 Ответить
7. BuriyLesha 596 14.01.21 10:59 Сейчас в теме
(6) предыдущий механизм проведения продержался несколько лет :) так что, думаю потребность у людей возникать будет еще долго.

Необходимо применять обычный говнокод.

не понял, к чему эта фраза относится?
8. user1515313 21.02.21 19:08 Сейчас в теме
(7) Для полноты статьи не хватает описания такого варианта: Необходимо дополнить проведение имеющееся документа ещё по одному регистру.
Общий модуль
krlexa; Дмитрий74Чел; rpgshnik; Donat; +4 Ответить
9. BuriyLesha 596 25.02.21 10:39 Сейчас в теме
(8)думаю это частный случай второй части статьи: там я добавил как новый документ, так и новые регистры.
Но спасибо Вам за предоставленный код, он может кому-нибудь пригодиться ;)
10. skv_79 378 12.08.21 12:46 Сейчас в теме
Раньше была похожая статья, но ее писал на базе ERP 2.4 https://infostart.ru/1c/articles/1097936/
11. Hatson 536 18.05.22 14:20 Сейчас в теме
12. user728106 02.06.22 11:06 Сейчас в теме
Подскажите, как лучше сделать, если по условию нужно не делать движения по части регистров?
13. BuriyLesha 596 02.06.22 12:41 Сейчас в теме
(12)данные для движений получаются запросами. поэтому вы можете в самих запросах эти условия и прописать.
14. user1485340 03.08.22 10:32 Сейчас в теме
Спасибо большое за статью! хотелось бы посмотреть саму базу, на которой создавали новый документ
15. BuriyLesha 596 03.08.22 11:36 Сейчас в теме
(14) база уже давно удалена :)
все внесенные изменения описаны в "спойлерах" в примере кода.
возможно интересует что-то конкретное?
16. user1485340 03.08.22 11:51 Сейчас в теме
(15) Для удаления записей при отмене проведения для независимых регистров надо что-то отдельно писать?
17. BuriyLesha 596 03.08.22 16:25 Сейчас в теме
(16) да, независимые регистры на то и независимые :)
user1485340; +1 Ответить
18. user1485340 03.08.22 16:32 Сейчас в теме
19. Aleksandr_Kotelnikov_mmc 18.10.22 17:20 Сейчас в теме
Спасибо за примеры, нужно было добавить в 2.5. новый документ с регистром, благодаря вашей статье все получилось сделать.
20. LomayaZakat 04.04.24 16:09 Сейчас в теме
Отличная статья. Очень помогла.
21. BuriyLesha 596 05.04.24 12:09 Сейчас в теме
(20)приятно, что даже спустя столько лет, статья все еще приносит пользу :)
22. andrew.ab 220 28.05.24 13:54 Сейчас в теме
а как сделать такое поведение: есть записи в независимом регистре сведений сформированные документ "ОтражениеВРег1", где несколько реквизитов не заполнены. Надо документом "ОтражениеВРег2" при проведении найти эти записи и до заполнить их.
23. BuriyLesha 596 28.05.24 14:12 Сейчас в теме
(22) отражение движений для каждого документа выполняется в отдельной транзакции. поэтому одновременно вы эти данные все равно не поменяете. поэтому для каждого документа пишете свою логику для записи в независимый регистр, которая будет отрабатывать независимо от действий другого документа.
либо пишите регламентное задание, которое будет периодически смотреть на этот регистр и дополнять необходимыми данными
24. andrew.ab 220 28.05.24 14:16 Сейчас в теме
(23) так одновременно и не надо. Один документ записал, другой потом скорректировал записи.
26. BuriyLesha 596 28.05.24 14:54 Сейчас в теме
(24) вы когда описываете движения в регистр сведений, то указываете отборы, по которым будет происходить запись набора записей.
набор записей по указанным отборам можно прочитать, изменить и записать заново.
условно у вас для документа ОтражениеВРег2 будет:

НаборЗаписей = РегистрыСведений.РС1.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(Значение1);
НаборЗаписей.Прочитать();

Для каждого Запись Из НаборЗаписей Цикл
Запись.Измерение2 = Значение2;
КонецЦикла;

НаборЗаписей.Записать(Истина);
25. andrew.ab 220 28.05.24 14:17 Сейчас в теме
(23)
регламентное задание, которое будет периодически смотреть на этот регистр и дополнять необходимыми данными
- не подходит, другой документ должен вносить корректировки в записи.
27. andrew.ab 220 28.05.24 15:14 Сейчас в теме
нашел, в менеджере записи регистра сведений функция по обновлению записи по разделителю

// Записывает в регистр данные по переданному разделителю записи.
//
// Параметры:
//  ТаблицыДляДвижений		 - Структура - содержит по ключу ТаблицыДляДвижений структуру
//  	имеющую ключ ТаблицаРасшифровкаДокументаПланирования (ТаблицаЗначений).
//  РазделительЗаписи		 - Строка - измерение, по которому необходимо выполнить запись
//  ЗамещатьЗаписи			 - Булево - определяет режим замещения существующих записей разделителя. Истина - перед записью существующие
//		записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям.
//
Процедура ЗаписатьДанныеРазделителя(ТаблицыДляДвижений, РазделительЗаписи, ЗамещатьЗаписи = Истина) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Набор = РегистрыСведений.РасшифровкаДокументаПланирования.СоздатьНаборЗаписей();
	Набор.Отбор.РазделительЗаписи.Установить(РазделительЗаписи);
	Набор.ЗагрузитьСОбработкой(ТаблицыДляДвижений["Таблица" + "РасшифровкаДокументаПланирования"]);
	Набор.Записать(ЗамещатьЗаписи);
	
	УстановитьПривилегированныйРежим(Ложь);
	
КонецПроцедуры
Показать
28. BuriyLesha 596 28.05.24 15:52 Сейчас в теме
(27) попробуйте глобальным поиском найти механизмы, которые используют независимые РС, например, так:
Параметры.НезависимыеРегистры.Добавить(

и в этих модулях посмотрите как реализован алгоритм в процедурах ЗаписатьДанные
29. Somebody1 69 23.08.24 11:36 Сейчас в теме
Доброго дня! Кто-то может посоветовать, как организовать в данном механизме контроль отрицательных остатков перед записью движений (по т.н. "старой методике")?
Оставьте свое сообщение