Склад адресного хранения. Тестовое задание (пример решения)

16.06.22

Разработка - Подготовка к аттестации

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

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

Наименование Файл Версия Размер
Склад Адресного хранения. тестовое задание: - конфигурация
.cf 123,69Kb
2
.cf 123,69Kb 2 Скачать
Склад Адресного хранения. тестовое задание, вариант решения.
.dt 100,77Kb
5
.dt 100,77Kb 5 Скачать

Тестовое задание

Дано:

Есть склад, на котором реализована адресная система хранения.

Каждое место хранения маркируется 3-х значным индексом вида:

<SS><NN><LL>

Где, SS номер ряда стеллажей, NN – номер стойки в ряду стеллажей, LL уровень стеллажа.

На складе ведется только количественный учет, без суммового.

Хранение товаров на складе определяется следующими правилами:

  • На каждом месте хранения одновременно может находиться только товар одного вида (один SKU).
  • Каждому товару присуще свойство – коэффициент паллетирования, указывающий сколько единиц хранения товара составляет паллету.
  • На одном месте хранения может храниться не более одной полной паллеты.

 

Задание:

Реализовать процессы склада, отвечающие следующим критериям:

Процесс

Критерий

Прием товара

Занять как можно меньше свободных мест хранения, соответственно оставить как можно больше свободных мест хранения

Инвентаризация

Частичная инвентаризация по товарным позициям или по местам хранения (ряд, стойка, уровень).

 

Создать следующие отчеты:

Отчет

Описание

Остатки товара

Остатки товара на складе по местам хранения

Загруженность склада

Временная диаграмма загруженности склада за выбранный период

 

Реализация похожа на ту, что в этой публикации //infostart.ru/1c/articles/556329/

Реализована конфигурация управления адресным складом., подход немного иной - через объект СкладскаяЯчейка, которая по сути есть паллета

1. Реализован алгоритм помещения на склад (размещения на паллете (складская ячейка)) произвольного количества некоего произвольного товара (генерируется автоматически случайным числом).

&НаСервере
Функция РазместитьТоварыПоЯчейкамСклада()
	тз = Новый ТаблицаЗначений;            	
	тз.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));	
	тз.Колонки.Добавить("Ячейка", Новый ОписаниеТипов("СправочникСсылка.СкладскиеЯчейки"));	
	тз.Колонки.Добавить("КоличествоПриход", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(5,0,ДопустимыйЗнак.Неотрицательный)));
	тз.Колонки.Добавить("Прим", Новый ОписаниеТипов("Строка"));

	тзТов = ЭтотОбъект.Товары.Выгрузить();		
	тзТов.Свернуть("Номенклатура","Количество");                                                                                           
	// добавл. вспомогательную колонку для отслеживания распределения,  пока не 0.
	тзТов.Колонки.Добавить("КоличОстаток", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(5,0,ДопустимыйЗнак.Неотрицательный)));
	// список не задействованных или уже освободившихся ячеек	
	// вариант, когда ячейки создаются по мере их потребности., иначе - создасть полный набор заранее...
	мПустЯч = ОбщНазнСерв.ПолучитьПустыеЯчейки(ЭтотОбъект.Дата); 
	тзЯчеекЕстьМесто = ОбщНазнСерв.ПолучитьЯчейкиТовараНедозаполненные(ЭтотОбъект.Дата, тзТов.ВыгрузитьКолонку("Номенклатура"));
	
	для каждого стрИст из тзТов цикл
		стрИст.КоличОстаток = стрИст.Количество;                                         
		если стрИст.Номенклатура.КоэфПалетирования = 0  Тогда
			ВызватьИсключение "КоэфПалетирования = 0 в товаре " + стрИст.Номенклатура.Наименование;
		Конецесли;	
			
		для каждого стрТ1 из тзЯчеекЕстьМесто.Скопировать(Новый Структура("Номенклатура", стрИст.Номенклатура)) цикл
			новСтр = тз.Добавить();      
			новСтр.Ячейка = стрТ1.Ячейка;	
			новСтр.Номенклатура = стрИст.Номенклатура;        
			
			КоличествоМест = стрИст.Номенклатура.КоэфПалетирования - стрТ1.ВНаличииОстаток;
			если КоличествоМест <= стрИст.КоличОстаток Тогда                               
				новСтр.КоличествоПриход = КоличествоМест;	
			иначе
				новСтр.КоличествоПриход = стрИст.КоличОстаток;
			Конецесли;
			
			новСтр.Прим = "add";
			стрИст.КоличОстаток = стрИст.КоличОстаток - новСтр.КоличествоПриход;					
			если стрИст.КоличОстаток <= 0 Тогда   // < 0 на случай ошибок  
				прервать;
			КонецЕсли;				
		КонецЦикла;	 
		
		если стрИст.КоличОстаток > 0 Тогда  // остальное кол-во этого Товара нужно разместить в других ячейках (кратно коэф.парлет)		
			для счПя = -(мПустЯч.Количество()-1) по 0 цикл 
				новСтр = тз.Добавить();      
				новСтр.Ячейка = мПустЯч[-счПя];	
				новСтр.Номенклатура = стрИст.Номенклатура;
				если стрИст.Номенклатура.КоэфПалетирования <= стрИст.КоличОстаток Тогда
					новСтр.КоличествоПриход = стрИст.Номенклатура.КоэфПалетирования;
				иначе	
					новСтр.КоличествоПриход = стрИст.КоличОстаток;
				КонецЕсли;	
				мПустЯч.Удалить(-счПя);
				
				новСтр.Прим = "неисп";
				стрИст.КоличОстаток = стрИст.КоличОстаток - новСтр.КоличествоПриход;					
				если стрИст.КоличОстаток <= 0 Тогда   // < 0 на случай ошибок  
					прервать;
				КонецЕсли;	
			КонецЦикла
		Конецесли;    

		если стрИст.КоличОстаток > 0 Тогда  // остальное кол-во этого Товара нужно разместить уже только в новых ячейках (кратно коэф.парлет)					
			// упрощ. вариант, однако в некоторых случая при таком подходе будет создаваться +1 лишняя палета без движений по ней...
			//мНовЯч = СоздатьНовуюЯчейкуСклада(1+(стрИст.КоличОстаток/стрИст.Номенклатура.КоэфПалетирования));  
			//создаем по одной:
			пока (стрИст.КоличОстаток > 0) цикл							
				новСтр = тз.Добавить();      
				новСтр.Ячейка = ОбщНазнСерв.СоздатьНовуюЯчейкуСклада();	
				новСтр.Номенклатура = стрИст.Номенклатура;
				если стрИст.Номенклатура.КоэфПалетирования <= стрИст.КоличОстаток Тогда
					новСтр.КоличествоПриход = стрИст.Номенклатура.КоэфПалетирования;
				иначе	
					новСтр.КоличествоПриход = стрИст.КоличОстаток;
				КонецЕсли;	          
				
				новСтр.Прим = "+нов";
				
				стрИст.КоличОстаток = стрИст.КоличОстаток - новСтр.КоличествоПриход;					
				если стрИст.КоличОстаток <= 0 Тогда   // < 0 на случай ошибок  
					прервать;
				КонецЕсли;					
			КонецЦикла	
		Конецесли			
				
	КонецЦикла;
	
	возврат тз;
КонецФункции

2. Регистр сведений АдресацияСкладскихЯчеек используется для обеспечения корректности (уникальности) адресации, а так же для блокировки ячеек от их одновременного изменения в соседнем процессе. Проверяющие посчитали это лишним., вопрос спорный., конечное решение за Вами.

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

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

Код его движений:

&НаСервере
Функция ПолучитьТоварыПоЯчейкамСклада()
	тз = Новый ТаблицаЗначений;            	
	тз.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));	
	тз.Колонки.Добавить("Ячейка", Новый ОписаниеТипов("СправочникСсылка.СкладскиеЯчейки"));	
	тз.Колонки.Добавить("КоличествоРасход", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(5,0,ДопустимыйЗнак.Неотрицательный)));

	тзТов = ЭтотОбъект.Товары.Выгрузить();	
	
	тзТов.Свернуть("Номенклатура","Количество");                                                                                           
	// добавл. вспомогательную колонку для отслеживания распределения,  пока не 0.
	тзТов.Колонки.Добавить("КоличОстаток", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(5,0,ДопустимыйЗнак.Неотрицательный)));

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

4. Инвентаризация

сделана лишь в части заполнения тч товары расчетными количеством по двум вариантам - по адресам или по товару свернуто.

в задании не описаны требования, соответственно, ввод факта, расчет расхождений и проведение НЕ ДЕЛАЛ. 

5. Диаграмма сделана дважды. По тем датам, по которым были движения (что логично, тк в интервалах изменений нет), и по всем датам периода (что привело к расширению диаграммы столбиками одинаковой длины.

Реализована на СКД через соединение двух источников данных (запросов). один из который дает периоды а второй значений в эти периоды. Так проще, чем делать запрос с последовательным получением остатка на начало, соединять с оборотами за период.

Однако, есть мнение, что такой подход не оптимален.

Платформа 8.3.14.

адресная система хранения. тестовое задание программиста

См. также

Автоматический заказ поставщику в 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    92001    116    40    

206

Программа для фулфилмента (FBS / FBO): модуль "Ответственное хранение" в 1С:УТ 11.5, КА 2.5, ERP 2.5

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

Программа для фулфилмента: модуль "Ответственное хранение" для 1С (УТ 11.5, КА 2.5, ERP 2.5) позволяет организовать учет ответственного хранения товаров с весовыми характеристиками, в том числе со сроком годности и личным кабинетом Поклажедателя. Модуль реализован в виде расширения конфигурации, устанавливается в режиме 1С:Предприятие 8 за 5 минут по инструкции, что позволяет оставить конфигурацию 1С на стандартной поддержке и продолжать получать стандартные обновления от фирмы "1С".

60000 руб.

09.06.2020    35625    30    59    

58

Загрузка номенклатуры в УТ11, КА 2, ERP 2, Розница 2 из Excel. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

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

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    212907    635    526    

448

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 09.04.2024, версия 9.9 - 9.10)

14400 руб.

20.11.2015    152590    370    376    

505

Перенос данных из УТ 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 оперативно выпускаем обновление переноса данных.

45650 руб.

24.04.2015    191666    135    239    

270
Оставьте свое сообщение