Копирование цен одного магазина в другой. Розница 2.3

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

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

Я потыкался и попробовал заполнить остатки стандартными средствами — никак. Можно заполнить остатки в пересчет, но на основании пересчета нельзя почему-то создать перемещение.

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

Но меня ждало разочарование — остатки заполняются только по номенклатуре, без характеристики. Пришлось допилить обработку «напильником»:

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

В итоге добавилось уже больше позиций, с характеристиками:

Далее создал на основании перемещения документ установки цен. Для этого пришлось заполнить цены по виду цен магазина-отправителя и провести документ перемещения на небольшое время, потому что на основании не проведенного документа перемещения нельзя создать документ установки цен.

Как только документ установки цен создался, сразу распровел и пометил на удаление это служебное перемещение.

Казалось бы по логике, в документе установки цен должны быть цены из перемещения и по виду цен склада-получателя. Но не тут-то бывало, там почему то добавился вид цен «Закупочная».

Ну что же. Добавил вид цен старого магазина, при этом заполнилась колонка «Старая цена». Нажал «Загрузить текущие назначенные цены», загрузились новые цены.

Далее с помощью волшебной внешней обработки «Администратор 1С [SBS]» загрузил этот документ установки цен номенклатуры и в табличной части «Виды цен» поменял на нужный мне вид цен в поле «Вид цены»:

И прямо из этой обработки провел документ установки цен.

Были опасения, что там, где цена не менялась 1С «оптимизирует» и не сделает движения по новой цене. Но потом я взглянул на структуру хранения и увидел, что старая цена там не хранится, это меня успокоило:

Но нет, движения сделались. Однако сам документ не открывался:

Я попробовал удалить строку вида цен, чтобы очистить хранилище значения, но ничего не получилось.

Я посмотрел внимательнее и понял, что проблема в том, что в табличной части «Товары» стояла старая цена. Поэтому и документ не открывался, что вид цен не соответствовал друг другу.

Пришлось воспользоваться дополнительно командой Еще — Изменить выделенные. Можно было в принципе, сразу к ней прибегнуть, поменяв вид цен в обоих табличных частях:

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

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

UPD: оказалось, что надо было делать перемещение на момент до того, как товар переместили, т.к. не на все товары встали цены — те, что не было на остатке, не попали в перемещение и установку цен.

Доработал код, чтобы подставлялись и остатки на дату перемещения и движения по текущую дату:

	Если ОБъект.ЗаПериодПоТекущуюДату Тогда
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		|	1 КАК КоличествоОстаток,
		|	ТоварыНаСкладахОстатки.Характеристика КАК Характеристика
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
		|ГДЕ
		|	ТоварыНаСкладахОстатки.Склад = &Склад
		|	И ТоварыНаСкладахОстатки.КоличествоОстаток >= &КоличествоОстаток
		|	И ТоварыНаСкладахОстатки.Склад.Магазин = &Магазин
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	ТоварыНаСкладахОстатки.Номенклатура,
		|	1,
		|	ТоварыНаСкладахОстатки.Характеристика
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Обороты(&Период, &Сейчас, , ) КАК ТоварыНаСкладахОстатки
		|ГДЕ
		|	ТоварыНаСкладахОстатки.Склад = &Склад
		|	//И ТоварыНаСкладахОстатки.КоличествоОборот <> 0 //Важно - у перемещений оборот ноль
		|	И ТоварыНаСкладахОстатки.Склад.Магазин = &Магазин";
	Иначе ...

Тут важно убрать контроль количества в оборотах, т.к. в перемещении оборот может быть нулевой.

UPD2: Задачу можно решить без программирования, посоветовали на Мисте. Можно заполнить документ установки цен по отбору по остаткам, это конечно не обороты за период, но все же не требует программирования:

Среда: Розница 2.3.4.33. Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

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

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