Разбор механизма заполнения вариантов обеспечения в документе Заказ клиента конфигурации УТ 11.4

26.10.20

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

В статье разберу работу механизма, порядок вызова процедур, подходы к обработке данных.

Вводные

1. Требуется при загрузке из внешней системы поставить товар в резерв

2. В лоб заполнить все строки "В резерв" и провести документ через "попытка Исключение" не подходит потому что специфика клиента разрешает частичный резерв при создании заказа из внешней системы.

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

 

Порядок работы

 

Работа от формы документа заказ клиента

При нажатии на кнопку "Заполнить обеспечение"

1. Проверяется корректность заполнения табличной части (ТЧ) с помощью ОбеспечениеКлиент.ПроверитьЗаполнение(...)

2. Открывается форма "ИсполнениеЗаказа"  в которой выбирается порядок обеспечения

3. Форма возвращает структуру

ПереченьВариантов = Новый Массив();
...
Результат = Новый Структура("ПереченьВариантов, ЗаполнятьЦелымиУпаковками");
Результат.ПереченьВариантов = ПереченьВариантов;
Результат.ЗаполнятьЦелымиУпаковками = ЗаполнятьЦелымиУпаковками;

4. В форме заказа данные поступают в ОбработкаВыбора() и перенаправляются в процедуру ЗаполнитьОбеспечениеВУстановленномПорядке()

5. Формируется таблица распределения с помощью Таблица = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспечения()

6. Данные таблицы переносятся в табличную часть документа с помощью Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения()

Проблема в том что процедуры используют "Элементы.Товары.ВыделенныеСтроки" и реквизиты которые находятся только на форме, список в ЗависимыеРеквизиты().

 

Подготовка данных

ТЗ ТаблицаЗаполнениеОбеспечения

1. Создается по описанию ОбеспечениеСервер.ПутиКДаннымПоУмолчанию() с добавлением колонки "Упаковка", как и структура "Хранилище" которая используется для предварительной загрузки и проверки данных.

2. Получает данные из ТаблицаТовары.НайтиПоИдентификатору(Идентификатор);

3. Заполняет добавленную строку через ОбеспечениеКлиентСервер.ЗаполнитьЗначенияСвойствСРазличиемИмен()

4. Дополняет поле Идентификатор = СтрокаТовары.ПолучитьИдентификатор(), если его не заполнить свернет с строки при обработке.

ТЗ "ОтборОформлено" создается по паре "Ссылка, КодСтроки", заполняется выделенными строками, количество в выделенных строках обнуляется.

ТЗ "ОформитьПоНакладным" - Таблица с полями "Ссылка", "КодСтроки", "Количество". Для каждой пары Заказ-КодСтроки содержит оформленное накладными количество.

ТЗ ТаблицаНевыделенныеСтроки так же переносится из табличной части с конвертацией с фильтром НЕ Количество = 0, а для выделенных строк оно было обнулено выше.

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

 

Обработка

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

 

Подготовка данных и обработка в обработке "Состояние обеспечения"

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

где

ИндексыСтрок.Добавить(СтрокаТовары.НомерСтроки - 1);

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

 

Перенос результатов в документ

Выполняется Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения()

При вызове из формы вызывается с указанием формы.

ТекстОповещения = Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения(
		Объект, ЭтаФорма, "СтрокиТовары", Таблица, ПараметрыУказанияСерий, ЗависимыеРеквизиты());

при вызове из обработки СостояниеОбеспечения вызывается без указания формы.

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

 

Пост обработка на уровне формы

Вызывается
 

СкладыСервер.ПриИзмененииСкладаВТабличнойЧасти(Объект.Товары, ТаблицаСкладов, СкладГруппа);

РассчитатьИтоговыеПоказателиЗаказа(ЭтаФорма);

 

Итог

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

Начав "раскапывать" со стороны формы и думая как переписывать код исполняющийся на клиенте нашел решение которое можно запустить на сервере.

 

С уважением к разработчикам типовых решений.

Благодарю за внимание.

УТ 11 Варианты обеспечения

См. также

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

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

20.08.2024    1758    PROSTO-1C    0    

18

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

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

01.07.2024    1766    Vidz    0    

11

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

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

24.06.2024    1117    olja-ljaaa    0    

3

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

Проблемы при создании ресурсной спецификации. Связь настроек спецификации и настроек структуры заказа в ЕРП 2.5.

06.05.2024    1205    It-digit    1    

2

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

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

1 стартмани

11.04.2024    1068    tango    5    

3
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Xershi 1555 03.02.20 10:09 Сейчас в теме
Мне нужно было разбить 1 строку без характеристик на несколько с характеристиками по ФИФО и чтобы цена не пересчиталась автоматом. Писал свой костыль в дебри кода на тот момент не полез.
2. malikov_pro 1324 03.02.20 10:25 Сейчас в теме
(1) Это немного про другое, там идет проверка на заполненность характеристик при флаге их использования в номенклатуре.
Какую бизнес задачу решали при распределении по характеристикам?
3. Xershi 1555 03.02.20 10:56 Сейчас в теме
(2) партионный учет через характеристики, чтобы назначать цену на партию. Типовой партионный не дает доступа к партии и заполняется только в регистре через закрытие.
4. Montirey 06.10.20 14:34 Сейчас в теме
malikov_pro, спасибо вам огромное, что выложили свое решение. Думаю, что в сумме вы сэкономили огромное количество человекочасов на решении этой проблемы программистам 1С.

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

Итоговый блок кода:

МассивВариантовОбеспечения = Новый Массив; // заполняйте теми вариантами, которые нужны в вашем случае
	МассивВариантовОбеспечения.Добавить(Перечисления.ВариантыОбеспечения.Отгрузить);
	МассивВариантовОбеспечения.Добавить(Перечисления.ВариантыОбеспечения.ОтгрузитьОбособленно);
	
	МассивИндексовВыделенныхСтрок = Новый Массив;
	
	Для каждого СтрокаТабличнойЧастиИз ЗаказКлиента_Объект.Товары Цикл
		МассивИндексовВыделенныхСтрок.Добавить(СтрокаТабличнойЧасти.НомерСтроки - 1);
	КонецЦикла;
	
	ПараметрыЗаполнения = Документы.ЗаказКлиента.ПараметрыВыбораОбеспечения(ЗаказКлиента_Объект.Статус);
	
	ТаблицаОбеспечения  = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспеченияДокумента(ЗаказКлиента_Объект, 
                          МассивВариантовОбеспечения, ПараметрыЗаполнения, МассивИндексовВыделенныхСтрок);
	
	Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения(ЗаказКлиента_Объект, Неопределено, "ИндексыСтрок", ТаблицаОбеспечения);
Показать

P.S. к сожалению не знаю, как отформатировать программный код в привычный всем стиль 1С :(
realEvgenius; adhocprog; alexstav; d4rkmesa; distorshion; dodgev; alenakrr; +7 Ответить
5. FatPanzer 06.10.20 14:43 Сейчас в теме
(4)
P.S. к сожалению не знаю, как отформатировать программный код в привычный всем стиль 1С :(
Прикрепленные файлы:
Montirey; +1 Ответить
6. Montirey 06.10.20 16:08 Сейчас в теме
13. alexstav 15 13.11.22 13:37 Сейчас в теме
7. malikov_pro 1324 06.10.20 22:25 Сейчас в теме
(4) Благодарю что скомпоновали. Основная цель в публикациях дать программистам-читателям блоки, из которых они смогут собрать нужный функционал.
Описанное в статье часть из модуля автоматической работы с заказами на перемещение исходя из потребностей заказов клиентов. В течении дня заказываются товары в офисе и резервируются на удаленном складе. В конце дня резерв переносится в заказ на перемещение с обособлением и добавлением до кратности упаковки.
8. al_zzz 301 14.08.21 13:51 Сейчас в теме
Возможно, коллеги, поможет сэкономить время следующая информация:
Конфигурация 1С:ERP Управление предприятием 2 (2.5.6.244).
Процедура из ОМ "ОбеспечениеСервер" ТаблицаЗаполнениеОбеспеченияДокумента(вызываемая для объекта) и ТаблицаЗаполнениеОбеспечения(вызываемая из формы) работают по-разному. У меня в результате при тех же переданных параметрах из формы и программно для объекта получались разные результаты - для объекта ничего не презаполнялось.
Причина в следующем коде, в процедуре "ТаблицаЗаполнениеОбеспеченияДокумента":
ПараметрыЗаполнения = Новый Структура("ПереченьВариантов, ИзменятьОбособление", ПереченьВариантов, Ложь);

в то время, как из формы передается параметр "ИзменятьОбособление" = Истина.
9. d4rkmesa 27.04.22 09:44 Сейчас в теме
(8)
поможет сэкономить время следующая информация:
Конфигурация 1С:ERP Управление предприятием 2 (2.5.6.244).
Процедура из ОМ "ОбеспечениеСервер" ТаблицаЗаполнениеОбеспеченияДокумента(вызываемая для объекта) и ТаблицаЗаполнениеОбеспечения(вызываемая из формы) работают по-разному. У меня в результате при тех же переданных параметрах из формы и программно для объекта получались разные р


Кстати, а в 2.5.7, где изменен переписан механизм обеспечения, аналогичное заполнение есть в принципе?
10. al_zzz 301 12.10.22 14:39 Сейчас в теме
(9)Присоединяюсь к вопросу. Команды в интерфейсе аналогичной я не нашёл. Если выбирать команду "Обеспечение" + "Резервировать", то просто меняется вариант обеспечения всей строки на "Резервировать".
14. al_zzz 301 13.11.22 14:03 Сейчас в теме
(10)
Раскуривал механизм в новой версии, в итоге, самостоятельно.
Там отличается тем, что как таковой процедуры, которая сможет проставить указанные статусы в тч нет. Сам процесс разбит на две части:
1. В товарах заполняется колонка "Доступно" из доступных для резервирования остатков.
2. Юзер выделяет нужные строки и выбирает нужный статус, при этом строки разбиваются как надо.
Попробовал поковырять типовой код, но там всё очень сильно завязано на форму. В итоге сделал внешнюю обработку, в которой у меня сама обработка имитировала форму. Правда, пришлось львиную долю процедур из ОМ "ОбеспечениеСервер" перетащить в саму обработку - так не взлетало. В итоге дошел до момента, когда в табличной части товаров заполняется колонка "Доступность". Т.е. выполнил шаг 1.
Дальше решил не испытывать судьбу(было потрачено неприлично много времени, чтоб сделать 1) и написал механизм смены статусов обеспечения в Заказах не используя типовой код.
Всё работает. На днях постараюсь запилить публикацию на эту тему.
16. user619846_n.taradanov 15.11.22 12:10 Сейчас в теме
(14) Очень даже есть
1.см. ОбщиеКоманды.РезервироватьЗаказ
2. Мы выдернули функцию ОбеспечениеВДокументахСервер.ВыполнитьДействиеДляЗаказовПослеВопроса(Параметры), слегка модифицировали её в части
				ТаблицаИзменений = ЗаполнитьВариантОбеспеченияПоОстаткамДляВыделенныхСтрокОбъекта(
					ДокументОбъект,
					КодДействия,
					ПараметрыЗаполнения,
					ИндексыСтрок,
					ПараметрыВстраивания);

Где "ИндексыСтрок" - индексы обрабатываемых строк.
Используем для автоматического резервирования заказов маркетов, автоустановке статуса к отгрузке по дате, и очереди резервирования строк заказов по дате отгрузки.
extalionos; user2015374; +2 Ответить
17. user619846_n.taradanov 15.11.22 12:43 Сейчас в теме
(14)Я кстати тоже по такому пути пошёл сначала. Обработка прям опухла очень быстро и стала похожа на ОМ "ОбеспечениеСервер",
а потом я завел поиск по "ДЕЙСТВИЕ_РЕЗЕРВИРОВАТЬ" и ответ нашёлся за 5 минут рассматривания результатов поиска)
15. user619846_n.taradanov 15.11.22 12:04 Сейчас в теме
(9) См. ОбщиеКоманды.РезервироватьЗаказ
Xershi; extalionos; d4rkmesa; +3 Ответить
21. Xershi 1555 27.05.24 15:01 Сейчас в теме
(15)
        
КодДействия = "ДЕЙСТВИЕ_РЕЗЕРВИРОВАТЬ";
ПараметрыЗаполнения = Неопределено;
        
ОбеспечениеВДокументахСервер.ЗаполнитьВариантОбеспеченияПоОстаткамДляВыделенныхСтрокОбъек­та(Док1СРезультат, КодДействия, ПараметрыЗаполнения, Неопределено, Неопределено, Неопределено);
	
11. malikov_pro 1324 12.10.22 15:56 Сейчас в теме
(9) Пока активно работаю с 2.4 по преценденту использования 2.5 напишу изменения.
(10) они оптимизировали меню (меньше пользователей пугает), по функционалу по сути нужно новую статью писать.
d4rkmesa; +1 Ответить
12. alexstav 15 13.11.22 13:35 Сейчас в теме
Спасибо! полезная статья, пригодилась.
18. uriah 18 07.07.23 14:31 Сейчас в теме
Добрый день! А как сделать так, что если товара в заказе больше чем на остатке на складе, действия процедур не делили строку товара на Отгрузить (остаток товара на складе) и Обеспечивать (превышение заказа)?
19. malikov_pro 1324 19.07.23 07:49 Сейчас в теме
(18) Переписывать механизм распределения (перехватывать результат и обрабатывать строки по своему), в целом у обработчиков проблема что они разделяют строку легко, а с объединением тяжко.
20. dimensity 15.09.23 17:54 Сейчас в теме
для 11.5.10 и новее - курите Документ.ЗаказКлиента.Форма.ФормаСпискаДокументов, там команды в командной панели есть
Прикрепленные файлы:
Ayne; Xershi; +2 Ответить
22. Stas84 10.06.24 01:04 Сейчас в теме
1С:Комплексная автоматизация 2 (2.5.17.74) снятие резерва на сервере по списку заказов

&НаСервере
Процедура ОбнулитьРезервПоЗаказу(Заказ)

Заказы = новый Массив;
Заказы.Добавить(Заказ);

ПараметрыЗаполнения = новый Структура;
ПараметрыЗаполнения.Вставить("СнятьФлагОтгружатьОднойДатой", Ложь);
ПараметрыЗаполнения.Вставить("ЗаполнитьДатуОтгрузкиОднойДатой", Ложь);

СтруктураПараметров = новый Структура;
СтруктураПараметров.Вставить("КодДействия", "ДЕЙСТВИЕ_КОБЕСПЕЧЕНИЮ");
СтруктураПараметров.Вставить("ПараметрыЗаполнения", ПараметрыЗаполнения);
СтруктураПараметров.Вставить("Заказы", Заказы);
СтруктураПараметров.Вставить("ПараметрыВстраивания", Неопределено);

Результат = ОбеспечениеВДокументахСервер.ВыполнитьДействиеДляЗаказовПослеВопроса(СтруктураПараметров);

КонецПроцедуры
malikov_pro; +1 Ответить
23. Xershi 1555 01.08.24 19:08 Сейчас в теме
КодДействия = "ДЕЙСТВИЕ_ОТГРУЗИТЬ";
	
ПараметрыЗаполнения = Неопределено;

ОбеспечениеВДокументахСервер.ЗаполнитьВариантОбеспеченияПоОстаткамДляВыделенныхСтрокОбъек­та(Заказ1С, КодДействия, ПараметрыЗаполнения, Неопределено, Неопределено, Неопределено);


Ключевое перед этим снять галку обособленно. Код стал проще.
Оставьте свое сообщение