gifts2017

Наличие товара у поставщика для УТ 10.3

Опубликовал Игорь Калчев (Igor030370) в раздел Программирование - Практика программирования

Многие поставщики товаров в своих прайс-листах публикуют колонку "Есть в наличии". Заполняют эту колонку по-разному. Бывает, поставят "+", а некоторые используют даже некий индикатор количества товара, например "***" - это много, "**" - в достаточном количестве, "*" - просто есть пока ещё (можно трактовать по разному).
Партнерам, которые используют в своей работе такие прайс-листы, удобно видеть наличие у поставщика в своих 1С:УТ в подборе номенклатуры или при оформлении счета на оплату покупателю.

Предлагаю несложный способ решить данную задачу в своей конфигурации 1С:УТ.

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

Тип реквизитов понятен: Номенклатура=СправочникСсылкаНоменклатура; Поставщик=СправочникСсылкаКонтрагенты; Док=ДокументСсылкаУстановкаЦенНоменклатуры; ЕстьВНаличии=Булево; ПредставлениеКоличества="Строка 30 переменная".


2. Добавим в документ "УстановкаЦенНоменклатуры" новую табличную часть "НаличиеУПоставщика". Она заполняется программно из обработки, которая формирует документ из прайс-листа. Интерактивной работы с этой таличной частью не предусмотрено, чтобы не "болела голова" при обновлении конфигурации.

 

3. Чтобы заполнять данными регистр (п.1) при проведении документа (п.2), добавим в конфигурацию новую подписку

Код обработки проведения:

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

4. ВНИМАНИЕ! В ваши процедуры формирования документов "УстановкаЦенНоменклатуры" обязательно добавьте код, который заполняет новую табличную часть "НаличеУПоставщика".

Например, так:

л_НоваяСтрокаНаличие = л_НовыйДокУстановкаЦен.НаличеУПоставщика.Добавить();
л_НоваяСтрокаНаличие.Поставщик = л_АЙТИ_партнер;
л_НоваяСтрокаНаличие.Номенклатура=л_Номенклатура;
л_НоваяСтрокаНаличие.ЕстьВНаличии=Ложь;
л_ЗначЕстьВНаличии=СокрЛП ( ExcelЛист.Cells(СтрExcel, 8).value);
Если л_ЗначЕстьВНаличии = "*" ИЛИ л_ЗначЕстьВНаличии = "**" ИЛИ л_ЗначЕстьВНаличии = "***" Тогда 
л_НоваяСтрокаНаличие.ЕстьВНаличии=Истина;
л_НоваяСтрокаНаличие.ПредставлениеКоличества=л_ЗначЕстьВНаличии;
КонецЕсли;

 

5. Для визуализации данных по наличию у поставщика необходимо добавить новые колонки "ЕстьУПоставщика" в табличной части "Товары" документа "СчетНаОплатуПокупателю". И в "ОсновнаяФорма" обработки "ПодборНоменклатуры"

6. В обработчик события Процедура СправочникНоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)

добавьте код, например, такой: 

//заполнить колонку "ЕстьВНаличииУПоставщика"
МодульНадстройка.ЗаполнитьКолонкуЕстьВНаличииУПоставщика(ОформленияСтрок,"Ссылка");

а в общем модуле добавьте вызываемые процедуры:

 

Процедура ПолучитьНаличиеУПостащика(п_НаДату,п_СписокНоменклатуры, п_ТЗ) Экспорт 
л_Запрос=Новый Запрос;
л_Запрос.Текст=
"ВЫБРАТЬ
| НаличиеТовараУПоставщикаСрезПоследних.Номенклатура,
| НаличиеТовараУПоставщикаСрезПоследних.Поставщик,
| МАКСИМУМ(НаличиеТовараУПоставщикаСрезПоследних.Период) КАК Период
|ПОМЕСТИТЬ ПоследниеЗначения
|ИЗ
| РегистрСведений.НаличиеТовараУПоставщика.СрезПоследних(&НаДату, Номенклатура В (&Номенклатура)) КАК НаличиеТовараУПоставщикаСрезПоследних
|
|СГРУППИРОВАТЬ ПО
| НаличиеТовараУПоставщикаСрезПоследних.Номенклатура,
| НаличиеТовараУПоставщикаСрезПоследних.Поставщик
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| НаличиеТовараУПоставщика.Номенклатура КАК Номенклатура,
| НаличиеТовараУПоставщика.Поставщик,
| НаличиеТовараУПоставщика.ЕстьВНаличии КАК ЕстьВНаличии,
| НаличиеТовараУПоставщика.Период КАК Период,
| НаличиеТовараУПоставщика.ПредставлениеКоличества
|ИЗ
| ПоследниеЗначения КАК ПоследниеЗначения
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаличиеТовараУПоставщика КАК НаличиеТовараУПоставщика
| ПО (НаличиеТовараУПоставщика.Номенклатура = ПоследниеЗначения.Номенклатура)
| И (НаличиеТовараУПоставщика.Поставщик = ПоследниеЗначения.Поставщик)
| И (НаличиеТовараУПоставщика.Период = ПоследниеЗначения.Период)
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| ЕстьВНаличии УБЫВ,
| Период УБЫВ";
л_Запрос.УстановитьПараметр("НаДату",п_НаДату);
л_Запрос.УстановитьПараметр("Номенклатура",п_СписокНоменклатуры);
п_ТЗ=л_Запрос.Выполнить().Выгрузить();
КонецПроцедуры //ПолучитьНаличиеУПостащика
 
Процедура ЗаполнитьКолонкуЕстьВНаличииУПоставщика(п_ОформлениеСтрок,п_ИмяКолонкиНоменклатура,п_НаДату="") Экспорт 
//заполнить колонку "ЕстьВНаличииУПоставщика"
л_СписокНоменклатуры=Новый Массив;
Для Каждого л_ОформлениеСтроки Из п_ОформлениеСтрок Цикл 
л_СписокНоменклатуры.Добавить(л_ОформлениеСтроки.данныестроки[п_ИмяКолонкиНоменклатура]);
КонецЦикла;
л_ТЗ=Новый ТаблицаЗначений;
МодульНадстройка.ПолучитьНаличиеУПостащика(?(ЗначениеЗаполнено(п_НаДату),п_НаДату,ТекущаяДата()),л_СписокНоменклатуры,л_ТЗ);
Если л_ТЗ.Количество() = 0 Тогда 
Возврат;
КонецЕсли;
Для Каждого л_ОформлениеСтроки Из п_ОформлениеСтрок Цикл 
л_МассивСтрок=л_ТЗ.НайтиСтроки(Новый Структура("Номенклатура",л_ОформлениеСтроки.ДанныеСтроки[п_ИмяКолонкиНоменклатура],"Номенклатура"));
л_ТекстЕстьВНаличии="";
Если л_МассивСтрок.Количество() = 0 Тогда 
л_ОформлениеСтроки.Ячейки.ЕстьУПоставщика.УстановитьТекст(л_ТекстЕстьВНаличии);
Продолжить;
КонецЕсли;
л_ЕстьВНаличии=Ложь;
Для Каждого л_Элемент Из л_МассивСтрок Цикл 
л_ЕстьВНаличии=л_ЕстьВНаличии ИЛИ л_Элемент.ЕстьВНаличии;
КонецЦикла;
Если НЕ л_ЕстьВНаличии Тогда 
л_ТекстЕстьВНаличии="Нет";
л_ОформлениеСтроки.Ячейки.ЕстьУПоставщика.УстановитьТекст(л_ТекстЕстьВНаличии);
Продолжить;
Иначе 
Для Каждого л_Элемент Из л_МассивСтрок Цикл 
л_ТекстЕстьВНаличии=л_ТекстЕстьВНаличии+Символы.ПС+л_Элемент.ЕстьВНаличии
+?(ЗначениеЗаполнено(л_Элемент.ПредставлениеКоличества),"<"+л_Элемент.ПредставлениеКоличества+">","")
+"("+л_Элемент.Поставщик+")";
КонецЦикла;
л_ТекстЕстьВНаличии=Прав(л_ТекстЕстьВНаличии,СтрДлина(л_ТекстЕстьВНаличии)-1);
КонецЕсли;
л_ОформлениеСтроки.Ячейки.ЕстьУПоставщика.УстановитьТекст(л_ТекстЕстьВНаличии);
КонецЦикла;
КонецПроцедуры //ЗаполнитьКолонкуЕстьВНаличииУПоставщика


Результат проведенных изменений:


Спасибо за внимание! Кому пригодилось - плюсуйте)

См. также

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