Решение задач 1С. Задача «Замена номенклатуры в табличной части»

В этой статье будете показано решение задачи, которую дали моему читателю в качестве проверочной на собеседовании во время приема не работу. Название задаче я придумал сам =)

Текст задачи:

В конфигурации имеется документ с табличной частью «Товары», у этой табличной части имеется реквизит, тип которого ссылка на справочник «Номенклатура». Требуется создать обработку, которая выполняет следующий функционал: у всех документов, у которых в табличной части имеется номенклатура «X», эта номенклатура должна заменяться на номенклатуру «Y». 

Решение:

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

Поскольку в задании не была указано, в какой конфигурации нужно реализовать решение, то создадим конфигурацию с одним справочником «Номенклатура» и одним документом «Продажи» (с табличной частью «Товары», в которой будет реквизит с типом ссылка на справочник «Номенклатура»).

Документ 1С и Справочник 1С

Создадим обработку, на управляемой форме которой будут два реквизита НоменклатураПоиска и НомкнклатураНаЗамену с типами ссылка на справочник «Номенклатура». И одна таблица значений с колонками Отметка и Документ, у первой колонки тип Булево, у второй тип – ссылка на документ «Продажи». Также на форме обработки будут две команды ПоискДокументов и Замена.

Управляемая форма 1С

При выполнении команды ПоискДокументов будем искать те документы, у которых в табличной части есть номенклатура из реквизита  НоменклатураПоиска.

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

&НаКлиенте
Процедура ПоискДокументов(Команда)
	
	Если Не ПроверитьЗаполнение() Тогда 
		Возврат;
	КонецЕсли;	
	
	ПоискДокументовНаСервере();
КонецПроцедуры

А при выполнении команды Замена, будем менять номенклатуру в найденных и отмеченных документах. При этом будем их записывать, если они не проведены, и проводить, если они проведены.

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

КонецПроцедуры

&НаКлиенте
Процедура Замена(Команда)
	
	Если НайденныеДокументы.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;	
	
	ЗаменаНаСервере();
КонецПроцедуры

Вот и всё задача выполнена!

Если вы в самом начале своего пути, то рекомендую эту задачу реализовать самостоятельно, а потом ещё раз, и ещё раз =).

Успеха в обучении!

Подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»


Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

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

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