Вывод остатка товаров на складе в документ Реализация товаров и услуг (для конфигурации Управление Торговлей 11.2 / 11.3 / 11.4)

29.12.17

Учетные задачи - Оптовая торговля

Пример динамического изменения (добавления) данных в табличной части формы стандартного документа из внешней обработки с использованием типа команды "ЗаполнениеФормы".

Скачать исходный код

Наименование Файл Версия Размер
Вывод остатка товаров на складе в документе Реализация товаров и услуг
.epf 5,92Kb
78
.epf 5,92Kb 78 Скачать
Вывод остатка товаров на складе в документе Заказ клиента
.epf 5,91Kb
47
.epf 5,91Kb 47 Скачать

Информация для пользователей:

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

Как это работает:
Если вам нужно быстро отобразить остатки, вы нажимаете на кнопку Заполнение -> Показать остаток товара на складе, и в уже открытую таблицу с товарами добавляется колонка, куда будет выведен доступный остаток товара на складе по каждой позиции номенклатуры из таблицы. Через меню Все действия -> Изменить форму вы можете найти группу элементов Заполнение, выбрать для неё Вид -> Группа кнопок, перетащить кнопку в удобное для вас место на форме документа. Там же можно переименовать заголовок новой колонки, передвинуть её в нужное вам место таблицы. Эти настройки сохранятся для всех последующих документов.

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


Информация для разработчиков:

Я решил выложить код обработки, потому что при написании его столкнулся с трудностями, и надеюсь новичкам (таким же как и я) этот материал поможет разобраться с тем, как работает обработка заполнения объекта с типом команды ЗаполнениеФормы. В сети есть куча материала на тему, как заполнять объекты через ВызовКлиентскогоМетода. Лично для меня эталонной стал вот эта публикация: //infostart.ru/public/84119/. Но там есть масса ограничений при работе с формой владельца. Так, в форме владельца не получится динамически создать новые реквизиты и элементы формы, применить условное оформление и т.п. (не говоря уже о том, что нужно создавать "невидимую" форму обработки и уже из модуля этой формы обращаться к форме владельца).

Частично можно было решить вопрос (в моем случае вопрос с динамическим добавлением на форму документа "Реализация товаров и услуг" новых реквизитов и элементов) через переопределение стандартных процедур создания форм в общем модуле МодификацияКонфигурацииПереопределяемый. Ваш код в этом модуле, по-идее, не должен затираться при обновлении конфигурации, но всё равно нужно было править типовую конфигурацию. Многие стараются этого избегать. Если интересно, можете почитать здесь: //infostart.ru/public/424358/.

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

Единственный минус в том, что тип команды ЗаполениеФормы реализован в новых БСП и доступен только в свежих релизах типовых конфигураций. Хотя "новый" - это понятие, вообще говоря, условное. Я так думаю, что этот материал сам по себе уже далеко не новый. Все спецы давно в курсе, конечно. Но я адресую эту публикацию в первую очередь новичкам, потому что повторюсь: на форумах куча древних веток на тему заполнения объектов, а из свеженького - совсем мало. Секрет что ли какой-то?

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

Кстати, узнать какую версию БСП использует ваша типовая конфигурация можно в режиме Конфигуратора: Общие -> Общие модули -> ОбновлениеИнформационнойБазыБСП.
 
Теперь перехожу от слов к делу. Ниже представлен код модуля объекта внешней обработки создания и заполнения колонки складских остатков в табличной части Товары документа "Реализация товаров и услуг":

// возвращает сведения о внешней обработке
Функция СведенияОВнешнейОбработке() Экспорт
	
	// здесь я указываю актуальную версию БСП, которую ипользует типовая конфигурация 
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");

	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Показать остатки'");
	НоваяКоманда.Идентификатор = "ПоказатьОстатки";
	
	// указываю тип команды "ЗаполнениеФормы" вместо "ВызовКлиентскогоМетода" 	
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
	НоваяКоманда.ПоказыватьОповещение = Ложь;

    // в конфигурации "Управление торговлей "версии 11.4 следующую строку нужно убрать, иначе команда отображаться не будет
    // в предыдущих версиях я так и не разобрался, где и что она скрывает
	НоваяКоманда.Скрыть = Истина;
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

// непосредственно код выполнения команды обработки
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
	
	Если ИдентификаторКоманды = "ПоказатьОстатки" Тогда
		
		// собственно, это и есть форма владельца (то есть форма документа назначения, в котором выполняется обработка)
		// её можно изменять на лету (динамически добавлять новые реквизиты и заполнять уже существующие, 
		// программно применять условное оформление и т.п.)
		// причем без необходимости назойливой проверки записанности данных перед вызовом обработки
		
		Форма = ПараметрыВыполнения.ЭтаФорма;
		
		// дальше рассматривается пример динамического создания и заполнения новой информационной колонки в табличной части Товары 
		// для отображения текущих остатков товара на складе 
		
		// создаем новый реквизит отбъекта и соответствующий ему элемент формы
		Если Форма.Элементы.Найти("ТоварыОстатки") = Неопределено Тогда 
			
			Реквизиты = Новый Массив; 
			Реквизиты.Добавить(Новый РеквизитФормы("Остатки", Новый ОписаниеТипов("Число"), "Объект.Товары" , "Доступно на складе", Ложь)); 
			Форма.ИзменитьРеквизиты(Реквизиты); 
	
			НовыйЭлементФормы = Форма.Элементы.Добавить("ТоварыОстатки", Тип("ПолеФормы"), Форма.Элементы.Товары); 			
			НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода; 
			НовыйЭлементФормы.ТолькоПросмотр = Истина;
			НовыйЭлементФормы.ПутьКДанным = "Объект.Товары.Остатки";
			
		КонецЕсли;

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

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

// вспомогательная функция запроса к регистру накопления ТоварыНаСкладах
Функция ПолучитьОстатокТовараИзРегистра(Номенклатура)
	
	Запрос = Новый Запрос;
	Запрос.Текст ="
		|	ВЫБРАТЬ
		|		ТоварыНаСкладахОстатки.Номенклатура,
		|		ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(ТоварыНаСкладахОстатки.КОтгрузкеОстаток, 0) КАК Остаток
		|	ИЗ 
		|		РегистрНакопления.ТоварыНаСкладах.Остатки( , Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки";
		
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
        Возврат Выборка.Остаток;
    Иначе 
        Возврат 0;
	КонецЕсли;    
	
КонецФункции 

Примечание:
Код самих обработок (тех, что выложены для скачивания) немного отличается от представленного выше: во-первых, выводятся свободные остатки (с учетом резерва); во-вторых, в запрос включено условие отбора по складу. Также добавлено немного форматирования и всякой мелочи. Например, если товара нет на складе, то отображается текстовое поле "<нет на складе>", и позиция товара подсвечивается красным цветом, колонка с остатками добавляется не в конец таблицы, а вставляется сразу за колонкой Количество и т.п.

внешняя обработка заполнение объекта заполнение формы

См. также

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

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

28500 руб.

21.04.2017    90885    108    40    

197

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    166384    702    362    

389

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

104000 руб.

18.03.2019    110638    34    114    

178

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11 / КА 2 / ERP 2. Переносятся документы, справочники и остатки

Обмен между базами 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

50722 45650 руб.

24.04.2015    190707    270    239    

269

Обмен с системой Меркурий через Web + Ветис.API для любых конфигураций (универсальная конфигурация Хамелеон Меркурий)

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Конфигурации 1cv8 Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий(тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

104000 руб.

08.11.2017    121067    295    140    

394
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ramir555 1 10.05.16 08:37 Сейчас в теме
Добрый день, спасибо за статью. Не подскажите, зачем НоваяКоманда.Скрыть = Истина?

В описание нашел

Признак того, что это служебная команда. Если установить в значение Истина, то команда скрывается в карточке дополнительного объекта.


Но так и не понял о каком объекте идет речь, что истина что ложь все равно отображается и в форме документа. Вы для чего её используете?
+
2. dklp 42 10.05.16 13:08 Сейчас в теме
(1) Ramir555, думаю, в данном конкретном случае можно эту строку кода вообще выкинуть. разницы никакой. я сам так и не разобрался, в каком месте этот параметр скрывает команду
+
3. yandesi 11.10.16 16:01 Сейчас в теме
Нужна такая же для УНФ 1.6.7
+
4. Pagor 06.07.17 12:21 Сейчас в теме
Здравствуйте, а данную обработку можно сделать для заказа клиента? многие используют реализации на основании заказов.
+
5. dklp 42 06.07.17 14:26 Сейчас в теме
(4) добавил аналогичную обработку для Заказа клиента
+
6. Pagor 07.07.17 17:28 Сейчас в теме
7. Pagor 09.07.17 01:17 Сейчас в теме
протестировал на ут 11.2.3.300 в заказах, работает! но, остаток показывает общий по номенклатуре, а не отдельно как (у многих наверное) у меня по характеристикам. возможно поправить?а так даже очень полезная вещь) спасибо
+
8. dklp 42 09.07.17 22:09 Сейчас в теме
(7) с остатками в разрезе серий и характеристик пока не разбирался :(
+
9. Pagor 10.07.17 12:45 Сейчас в теме
10. MAER2305 07.12.17 13:20 Сейчас в теме
Здравсвуйте! скачала Вашу обработку, спасибо. Правда одаптировала под ЧекККМ, но не понятно, почему кнопка появляется только в ФормаДокумента, а мне нужен остаток в ФормаДокументаРМК. (УТ11.2 Документ.ЧекККМ) Подскажите как добавить команту Показать Остатки на другую форму Документа. Заранее благодарю.
+
11. dklp 42 07.12.17 22:39 Сейчас в теме
(10)
в сведениях о внешней обработке поле Назначение задает тот объект конфигурации, для которого будет назначена обработка

 ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");

укажите в этой строке вместо РеализацияТоваровУслуг тот документ, который вам нужно
+
12. user669256 08.12.17 11:30 Сейчас в теме
Здравствуйте! Самая востребованная обработка!!! С момента появления работала под всеми релизами УТ 11.3..., без нее, уже все ни то и все ни так. Пожалуйста, адаптируйте ее для УТ11.4.
Заранее спасибо!
+
13. dklp 42 29.12.17 12:36 Сейчас в теме
(12)
После обновления конфигурации на 11.4 нужно внести небольшие изменения в код функции СведенияОВнешнейОбработке() модуля объекта внешней обработки:

1) во-первых, находим и полностью убираем или комментируем строку кода

НоваяКоманда.Скрыть = Истина; 

2) во-вторых (а вот здесь интересно!) меняем представление команды

НоваяКоманда.Представление = НСтр("ru = 'Показать доступность товара на складе'");

на более короткое

НоваяКоманда.Представление = НСтр("ru = 'Показать остатки'");

Если этого не сделать, то на форме документа с настройками по умолчанию команда будет отображаться только в виде значка (без текста). Либо нужно будет в настройках самой формы поменять для команды свойство Отображение с "Авто" на "Текст".

В шапке уже выложены доработанные обработки с поддержкой конфигурации Управление торговлей 11.4
romankoav; +1
14. igor2011 27.03.18 23:45 Сейчас в теме
Подскажите, а как в том же заказе клиента, вновь полученный столбец вывести на печать?
+
15. dklp 42 28.03.18 12:42 Сейчас в теме
(14) вывод на печать не предусмотрен. для этого нужно создавать отдельную печатную форму
+
16. aden_one 12.03.19 13:11 Сейчас в теме
А вывести остатки по складам в заказы возможно?
+
17. pollack 08.08.19 11:28 Сейчас в теме
Кто-нибудь разобрался, как в обработку заполнения типа "ЗаполнениеФормы" на сервер передается управляемая форма
(ПараметрыВыполнения.ЭтаФорма)?
romankoav; +1
19. romankoav 4 12.05.20 17:38 Сейчас в теме
(17) Да, это очень интересный вопрос. Придется отладчиком смотреть
+
18. alexruzh67 24.08.19 03:31 Сейчас в теме
Как ведет себя обработка при использовании группы складов?
+
20. romankoav 4 12.05.20 17:40 Сейчас в теме
Вот такая ситуация. конфа КА2. Если делать внешнюю обработку с ВызовКлиентскогоМетода, то предварительно система просить записать документ - что не возможно, данных то нет )). Переделываешь на "ЗаполнениеФормы", но тогда вызывается метод в модуле объекта внешней обработки, но мне нужно выбрать файл для загрузки в документ... Что делать? есть оптимальное решение?
+
21. atdonya 101 26.01.21 16:35 Сейчас в теме
Во-первых, огромное спасибо за отличную статью.
У меня есть вопрос из немного параллельной области, не сталкивались ли вы с программным заданием условного форматирования
При добавлении остатков у меня возникла задача подсветить отрицательные красным цветом.
// Товары - это таблица документа, так же называется и элемент на форме
// Остатки -это добавленный реквизит в таблице Товары - это число
// ТоварыОстатки - это добавленный элемент формы

//создаю элемент условного отбора для фомы
врЭлементУО = Форма.УсловноеОформление.Элементы.Добавить();

//добавляю к нему в отбор условие сравнения с нулем поля Остатки из Товаров
врОтборУО = врЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
врОтборУО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.Остатки");
врОтборУО.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; 
врОтборУО.ПравоеЗначение = 0;
//врОтборУО.ПравоеЗначение = Форма.Элементы.Найти("Товары.Количество");// на случай сравнения с количеством
врОтборУО.Использование = Истина;

//устанавливаю, что именно будет меняться - в моем случае я хочу, чтобы цвет текста для отрицательных был красным
врЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
врЭлементУО.Использование = Истина;

//указываю, какое именно поле раскрашивать
врПолеОформления = врЭлементУО.Поля.Элементы.Добавить();
врПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыОстатки");
врПолеОформления.Использование = Истина;			
Показать

Но при таком варианте почему-то у меня светится красным нужное поле, но во всех строках, то есть отбор не работает.
Может, кто знает, что я делаю не так?
Yan_Malyakov; +1
22. atdonya 101 26.01.21 17:08 Сейчас в теме
(21) Приятно поговорить с умным человеком ))) я сам нашел, если кому поможет, то прикол в том, что
врОтборУО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.Остатки");

надо писать как
врОтборУО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Остатки");
Yan_Malyakov; +1
23. user727369 21.05.21 01:59 Сейчас в теме
Доброго времени суток всем.
Для вывода остатка по характеристикам необходимо в коде поменять немного
СКРИН ПРИКЛАДЫВАЮ
Прикрепленные файлы:
+
24. user727369 21.05.21 02:02 Сейчас в теме
Сам документ
Прикрепленные файлы:
+
Оставьте свое сообщение