#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция УстановитьСтатус(НовыйСтатус, ДополнительныеПараметры) Экспорт
Статус = Перечисления.СтатусыСборокТоваров[НовыйСтатус];
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.СборкаТоваров);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.ТЧ);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект,ПараметрыУказанияСерий.Шапка);
Возврат ПроверитьЗаполнение();
КонецФункции
Процедура ИнициализироватьПараметрыЗаполненияВидовЗапасовДляПроведения(ДокументОбъект, РежимЗаписи = Неопределено) Экспорт
ДокументОбъект.ДополнительныеСвойства.Вставить("ПараметрыЗаполненияВидовЗапасов", ПараметрыЗаполненияВидовЗапасов());
КонецПроцедуры
Процедура ЗаполнитьАналитикиУчетаНоменклатуры() Экспорт
ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров();
АналитикаУчетаНоменклатуры = АналитикаУчетаНоменклатурыШапкиДокумента();
КонецПроцедуры
Функция ВременныеТаблицыДанныхДокумента() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| &Организация КАК Организация,
| &Дата КАК Дата,
| &Склад КАК Склад,
| &Статус КАК Статус,
| Неопределено КАК Партнер,
| Неопределено КАК Контрагент,
| ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) КАК Соглашение,
| ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка) КАК Договор,
| ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) КАК Валюта,
| &СборкаПодДеятельность КАК НалогообложениеНДС,
| &ХозяйственнаяОперация КАК ХозяйственнаяОперация,
| ЛОЖЬ КАК ЕстьСделкиВТабличнойЧасти,
| ВЫБОР
| КОГДА &ФормироватьВидыЗапасовПоПодразделениямМенеджерам И НЕ ЕСТЬNULL(Сделки.ОбособленныйУчетТоваровПоСделке, Ложь)
| И Подразделения.ВариантОбособленногоУчетаТоваров = ЗНАЧЕНИЕ(Перечисление.ВариантыОбособленногоУчетаТоваров.ПоПодразделению)
| ТОГДА &Подразделение
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка)
| КОНЕЦ КАК Подразделение,
| ВЫБОР
| КОГДА &ФормироватьВидыЗапасовПоПодразделениямМенеджерам И НЕ ЕСТЬNULL(Сделки.ОбособленныйУчетТоваровПоСделке, Ложь)
| И Подразделения.ВариантОбособленногоУчетаТоваров = ЗНАЧЕНИЕ(Перечисление.ВариантыОбособленногоУчетаТоваров.ПоМенеджерамПодразделения)
| ТОГДА &Менеджер
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
| КОНЕЦ КАК Менеджер,
| ВЫБОР
| КОГДА &ФормироватьВидыЗапасовПоСделкам И Сделки.ОбособленныйУчетТоваровПоСделке
| ТОГДА &Сделка
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СделкиСКлиентами.ПустаяСсылка)
| КОНЕЦ КАК Сделка,
| &НоменклатураОсновногоКомпонента КАК НоменклатураОсновногоКомпонента,
| &ХарактеристикаОсновногоКомпонента КАК ХарактеристикаОсновногоКомпонента,
| ЗНАЧЕНИЕ(Перечисление.ТипыЗапасов.Товар) КАК ТипЗапасов
|ПОМЕСТИТЬ ТаблицаДанныхДокумента
|ИЗ
| Справочник.Организации КАК Организации
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтруктураПредприятия КАК Подразделения
| ПО Подразделения.Ссылка = &Подразделение
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СделкиСКлиентами КАК Сделки
| ПО Сделки.Ссылка = &Сделка
|
|ГДЕ
| Организации.Ссылка = &Организация
|;
|
|
|ВЫБРАТЬ
| ТаблицаТоваров.НомерСтроки КАК НомерСтроки,
| ТаблицаТоваров.Номенклатура КАК Номенклатура,
| ТаблицаТоваров.Характеристика КАК Характеристика,
| ТаблицаТоваров.Серия КАК Серия,
| ТаблицаТоваров.СтатусУказанияСерий КАК СтатусУказанияСерий,
| ТаблицаТоваров.Назначение КАК Назначение,
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Количество КАК Количество,
| ВЫБОР
| КОГДА НЕ &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров
| ИЛИ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) < &ДатаНачалаУчетаПрослеживаемыхИмпортныхТоваров
| ТОГДА 0
| ИНАЧЕ &ТекстПоляТаблицаТоваровКоличествоПоРНПТ_
| КОНЕЦ КАК КоличествоПоРНПТ,
| &ЗаказНаСборку КАК Заказ,
| ТаблицаТоваров.КодСтроки КАК КодСтроки,
| &ТекстПоляТаблицаТоваровНомерГТД_ КАК НомерГТД
|ПОМЕСТИТЬ ВтТаблицаТоваровСписание
|ИЗ
| &ТаблицаТоваровСписание КАК ТаблицаТоваров
|;
|
|
|ВЫБРАТЬ
| ТаблицаТоваров.НомерСтроки КАК НомерСтроки,
| ТаблицаТоваров.Номенклатура КАК Номенклатура,
| ТаблицаТоваров.Характеристика КАК Характеристика,
| ТаблицаТоваров.Серия КАК Серия,
| ТаблицаТоваров.СтатусУказанияСерий КАК СтатусУказанияСерий,
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Количество КАК Количество,
| ТаблицаТоваров.КоличествоПоРНПТ КАК КоличествоПоРНПТ,
| &Склад КАК Склад,
| &Сделка КАК Сделка,
| ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка) КАК СтавкаНДС,
| 0 КАК СуммаСНДС,
| 0 КАК СуммаНДС,
| 0 КАК СуммаВознаграждения,
| 0 КАК СуммаНДСВознаграждения,
| ТаблицаТоваров.Назначение КАК Назначение,
| ИСТИНА КАК ПодбиратьВидыЗапасов,
| ТаблицаТоваров.НомерГТД КАК НомерГТД
|ПОМЕСТИТЬ ТаблицаТоваров
|ИЗ
| ВтТаблицаТоваровСписание КАК ТаблицаТоваров
|;
|
|
|ВЫБРАТЬ
| ТаблицаВидыЗапасов.НомерСтроки КАК НомерСтроки,
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаВидыЗапасов.ВидЗапасов КАК ВидЗапасов,
| ТаблицаВидыЗапасов.НомерГТД КАК НомерГТД,
| ТаблицаВидыЗапасов.Количество КАК Количество,
| ВЫБОР
| КОГДА НЕ &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров
| ИЛИ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) < &ДатаНачалаУчетаПрослеживаемыхИмпортныхТоваров
| ТОГДА 0
| ИНАЧЕ ТаблицаВидыЗапасов.КоличествоПоРНПТ
| КОНЕЦ КАК КоличествоПоРНПТ,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК СкладОтгрузки,
| &Склад КАК Склад,
| &Сделка КАК Сделка,
| &ВидыЗапасовУказаныВручную КАК ВидыЗапасовУказаныВручную
|ПОМЕСТИТЬ ВтВидыЗапасовСписание
|ИЗ
| &ТаблицаВидыЗапасовСписание КАК ТаблицаВидыЗапасов
|
|;
|
|ВЫБРАТЬ
| ТаблицаВидыЗапасов.НомерСтроки КАК НомерСтроки,
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| Аналитика.Номенклатура КАК Номенклатура,
| Аналитика.Характеристика КАК Характеристика,
| Аналитика.Серия КАК Серия,
| ТаблицаВидыЗапасов.ВидЗапасов КАК ВидЗапасов,
| ТаблицаВидыЗапасов.НомерГТД КАК НомерГТД,
| ТаблицаВидыЗапасов.Количество КАК Количество,
| ТаблицаВидыЗапасов.КоличествоПоРНПТ КАК КоличествоПоРНПТ,
| ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК СкладОтгрузки,
| &Склад КАК Склад,
| &Сделка КАК Сделка,
| &ВидыЗапасовУказаныВручную КАК ВидыЗапасовУказаныВручную
|ПОМЕСТИТЬ ТаблицаВидыЗапасов
|ИЗ
| ВтВидыЗапасовСписание КАК ТаблицаВидыЗапасов
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлючиАналитикиУчетаНоменклатуры КАК Аналитика
| ПО ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры = Аналитика.Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| АналитикаУчетаНоменклатуры
|;
|
|
|ВЫБРАТЬ
| ТаблицаТоваров.НомерСтроки КАК НомерСтроки,
| ТаблицаТоваров.Номенклатура КАК Номенклатура,
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Назначение КАК Назначение,
| ТаблицаТоваров.Количество КАК Количество
|ПОМЕСТИТЬ ВтТаблицаТоваровОприходование
|ИЗ
| &ТаблицаТоваровОприходование КАК ТаблицаТоваров
|;
|
|
|ВЫБРАТЬ
| ТаблицаВидыЗапасов.НомерСтроки КАК НомерСтроки,
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаВидыЗапасов.ВидЗапасов КАК ВидЗапасов,
| ТаблицаВидыЗапасов.Количество КАК Количество,
| ВЫБОР
| КОГДА НЕ &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров
| ИЛИ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) < &ДатаНачалаУчетаПрослеживаемыхИмпортныхТоваров
| ТОГДА 0
| ИНАЧЕ ТаблицаВидыЗапасов.КоличествоПоРНПТ
| КОНЕЦ КАК КоличествоПоРНПТ
|ПОМЕСТИТЬ ВтВидыЗапасовОприходование
|ИЗ
| &ТаблицаВидыЗапасовОприходование КАК ТаблицаВидыЗапасов
|;
|
|
|ВЫБРАТЬ
| ТаблицаТоваров.НомерСтроки КАК НомерСтроки,
| ТаблицаТоваров.Номенклатура КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ВидыЗапасов.ПустаяСсылка) КАК ТекущийВидЗапасов,
| ЛОЖЬ КАК ЭтоВозвратнаяТара,
| &Организация КАК Организация,
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.СборкаТоваров) КАК ХозяйственнаяОперация,
| ЗНАЧЕНИЕ(Перечисление.ТипыЗапасов.Товар) КАК ТипЗапасов,
| ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) КАК Соглашение,
| ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) КАК Контрагент,
| ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка) КАК Договор,
| ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) КАК Валюта,
| &СборкаПодДеятельность КАК НалогообложениеНДС,
| &НалогообложениеОрганизации КАК НалогообложениеОрганизации,
| НЕОПРЕДЕЛЕНО КАК ВладелецТовара,
| ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка) КАК ВидЦены
|ПОМЕСТИТЬ ИсходнаяТаблицаТоваров
|ИЗ
| ВтТаблицаТоваровОприходование КАК ТаблицаТоваров
|";
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
ПараметрыУчетаПоОрганизации = УчетНДСУП.ПараметрыУчетаПоОрганизации(Организация, Дата);
Если ДополнительныеСвойства.Свойство("ТаблицыЗаполненияВидовЗапасовПриОбмене")
И ДополнительныеСвойства.ТаблицыЗаполненияВидовЗапасовПриОбмене <> Неопределено Тогда
ТаблицыДокумента = ДополнительныеСвойства.ТаблицыЗаполненияВидовЗапасовПриОбмене;
Иначе
ТаблицыДокумента = Документы.СборкаТоваров.КоллекцияТабличныхЧастейТоваров();
ЗаполнитьЗначенияСвойств(ТаблицыДокумента, ЭтотОбъект);
ЗаполнитьЗначенияСвойств(ТаблицыДокумента.ШапкаДокумента, ЭтотОбъект);
КонецЕсли;
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров Тогда
ТаблицаТоваровСписание = ТаблицыДокумента.Товары;
ТаблицаТоваровОприходование = СформироватьТаблицуТоваров(ТаблицыДокумента.ШапкаДокумента);
Иначе
ТаблицаТоваровСписание = СформироватьТаблицуТоваров(ТаблицыДокумента.ШапкаДокумента);
ТаблицаТоваровОприходование = ТаблицыДокумента.Товары;
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Менеджер", Ответственный);
Запрос.УстановитьПараметр("Подразделение", Подразделение);
Запрос.УстановитьПараметр("Сделка", Сделка);
Запрос.УстановитьПараметр("ХозяйственнаяОперация", ХозяйственнаяОперация);
Запрос.УстановитьПараметр("Серия", Серия);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ЗаказНаСборку", ЗаказНаСборку);
Запрос.УстановитьПараметр("СборкаПодДеятельность", СборкаПодДеятельность);
Запрос.УстановитьПараметр("Назначение", Назначение);
Запрос.УстановитьПараметр("ВидыЗапасовУказаныВручную", ВидыЗапасовУказаныВручную);
Запрос.УстановитьПараметр("НалогообложениеОрганизации", ПараметрыУчетаПоОрганизации.ОсновноеНалогообложениеНДСПродажи);
Запрос.УстановитьПараметр("ФормироватьВидыЗапасовПоПодразделениямМенеджерам", ПолучитьФункциональнуюОпцию("ФормироватьВидыЗапасовПоПодразделениямМенеджерам"));
Запрос.УстановитьПараметр("ФормироватьВидыЗапасовПоСделкам", ПолучитьФункциональнуюОпцию("ФормироватьВидыЗапасовПоСделкам"));
Запрос.УстановитьПараметр("НоменклатураОсновногоКомпонента", НоменклатураОсновногоКомпонента);
Запрос.УстановитьПараметр("ХарактеристикаОсновногоКомпонента", ХарактеристикаОсновногоКомпонента);
Запрос.УстановитьПараметр("Статус", Статус);
Запрос.УстановитьПараметр("ТаблицаТоваровСписание", ТаблицаТоваровСписание);
Запрос.УстановитьПараметр("ТаблицаТоваровОприходование", ТаблицаТоваровОприходование);
Запрос.УстановитьПараметр("ТаблицаВидыЗапасовСписание", ВидыЗапасовСписание);
Запрос.УстановитьПараметр("ТаблицаВидыЗапасовОприходование", ВидыЗапасовОприходование);
УчетПрослеживаемыхТоваровЛокализация.УстановитьПараметрыИспользованияУчетаПрослеживаемыхТоваров(Запрос);
ЗапасыСервер.ДополнитьВременныеТаблицыОбязательнымиКолонками(Запрос);
ЗапасыСервер.ПроверитьНеобходимостьПерезаполненияВидовЗапасовДокумента(ЭтотОбъект, Запрос);
ОбщегоНазначенияУТ.ЗаменитьОтсутствующиеПоляТаблицыЗначенийВТекстеЗапроса(
ТаблицаТоваровСписание,
Запрос.Текст,
"&ТекстПоляТаблицаТоваровКоличествоПоРНПТ_",
"ТаблицаТоваров",
"КоличествоПоРНПТ",
"ТаблицаТоваров.КоличествоПоРНПТ",
"0");
ОбщегоНазначенияУТ.ЗаменитьОтсутствующиеПоляТаблицыЗначенийВТекстеЗапроса(
ТаблицаТоваровСписание,
Запрос.Текст,
"&ТекстПоляТаблицаТоваровНомерГТД_",
"ТаблицаТоваров",
"НомерГТД",
"ТаблицаТоваров.НомерГТД",
"ЗНАЧЕНИЕ(Справочник.НомераГТД.ПустаяСсылка)");
Запрос.Выполнить();
Возврат МенеджерВременныхТаблиц;
КонецФункции
Процедура ЗаполнитьВидыЗапасовПриОбмене(Отказ, ТаблицыДокумента) Экспорт
ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров();
Если ТаблицыДокумента <> Неопределено Тогда
ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров(ТаблицыДокумента);
ЗаполнитьЗначенияСвойств(ТаблицыДокумента.ШапкаДокумента, ЭтотОбъект, "АналитикаУчетаНоменклатуры");
ДополнительныеСвойства.Вставить("ТаблицыЗаполненияВидовЗапасовПриОбмене", ТаблицыДокумента);
Иначе
ИмяПараметра = "ТаблицыДокумента";
ТекстИсключения = НСтр("ru = 'Для заполнения видов запасов не передан параметр ""%1"".'");
ТекстИсключения = СтрШаблон(ТекстИсключения, ИмяПараметра);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ЗаполнитьВидыЗапасов(Отказ);
ДополнительныеСвойства.Удалить("ТаблицыЗаполненияВидовЗапасовПриОбмене");
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ПриКопировании(ОбъектКопирования)
ИсправлениеДокументов.ПриКопировании(ЭтотОбъект, ОбъектКопирования);
Статус = Метаданные().Реквизиты.Статус.ЗначениеЗаполнения;
ЗаказНаСборку = Неопределено;
ВидыЗапасовУказаныВручную = Ложь;
ВидыЗапасовСписание.Очистить();
ВидыЗапасовОприходование.Очистить();
Серии.Очистить();
ИнициализироватьДокумент();
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РазборкаТоваров Тогда
Для Каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.КодСтроки = 0;
СтрокаТЧ.ИдентификаторСтроки = "";
КонецЦикла;
Таблица = Новый ТаблицаЗначений();
Структура = Новый Структура("Индекс,Номенклатура,Назначение");
Для Каждого Поле Из Структура Цикл
Таблица.Колонки.Добавить(Поле.Ключ, Поле.Значение);
КонецЦикла;
СтрокаТаблицы = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭтотОбъект);
СтрокаТаблицы.Индекс = 0;
НазначениеПоУмолчанию = НаправленияДеятельностиСервер.ТолкающееНазначение(НаправлениеДеятельности);
НакладныеСервер.ЗаполнитьНазначенияВТабличнойЧасти(Таблица, НазначениеПоУмолчанию);
Назначение = Таблица[0].Назначение;
Иначе
Для Каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.КодСтроки = 0;
СтрокаТЧ.ИдентификаторСтроки = "";
КонецЦикла;
НазначениеПоУмолчанию = НаправленияДеятельностиСервер.ТолкающееНазначение(НаправлениеДеятельности);
НакладныеСервер.ЗаполнитьНазначенияВТабличнойЧасти(Товары, НазначениеПоУмолчанию);
КонецЕсли;
ВариантПриемкиТоваров = ЗакупкиСервер.ПолучитьВариантПриемкиТоваров();
ОбщегоНазначенияУТ.ОчиститьИдентификаторыДокумента(ЭтотОбъект, "Товары,ВидыЗапасовСписание");
СборкаТоваровЛокализация.ПриКопировании(ЭтотОбъект, ОбъектКопирования);
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
ИспользоватьХарактеристики = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
ХозяйственныеОперации = Перечисления.ХозяйственныеОперации;
ПараметрыПроверки = НоменклатураСервер.ПараметрыПроверкиЗаполненияКоличества();
ПараметрыПроверки.ИмяТЧ = "Объект";
НоменклатураСервер.ПроверитьЗаполнениеКоличества(ЭтотОбъект, ПроверяемыеРеквизиты, Отказ, ПараметрыПроверки);
НоменклатураСервер.ПроверитьЗаполнениеКоличества(ЭтотОбъект, ПроверяемыеРеквизиты, Отказ);
Если ХозяйственнаяОперация = ХозяйственныеОперации.СборкаТоваров Или Товары.Количество() < 2 Тогда
МассивНепроверяемыхРеквизитов.Добавить("Товары.ДоляСтоимости");
КонецЕсли;
Если Не ЗначениеЗаполнено(ЗаказНаСборку) Тогда
МассивНепроверяемыхРеквизитов.Добавить("Товары.КодСтроки");
КонецЕсли;
Если Не ИспользоватьХарактеристики
Или Не Справочники.Номенклатура.ХарактеристикиИспользуются(Номенклатура) Тогда
МассивНепроверяемыхРеквизитов.Добавить("Характеристика");
КонецЕсли;
ЗапретитьПоступлениеТоваровБезНомеровГТД = ПолучитьФункциональнуюОпцию("ЗапретитьПоступлениеТоваровБезНомеровГТД");
ИспользоватьУчетПрослеживаемыхИмпортныхТоваров =
УчетПрослеживаемыхТоваровЛокализация.ИспользоватьУчетПрослеживаемыхИмпортныхТоваров(Дата);
ИменаРеквизитов = "ВестиУчетПоГТД, ПрослеживаемыйТовар";
РеквизитыНоменклатуры = ОбщегоНазначенияУТ.ЗначенияРеквизитовОбъектаПоУмолчанию(Номенклатура, ИменаРеквизитов);
ПрослеживаемыйКомплект = РеквизитыНоменклатуры.ПрослеживаемыйТовар
И ИспользоватьУчетПрослеживаемыхИмпортныхТоваров;
КонтролироватьНомераГТД = ЗапретитьПоступлениеТоваровБезНомеровГТД
И ((РеквизитыНоменклатуры.ВестиУчетПоГТД
И ХозяйственнаяОперация = ХозяйственныеОперации.СборкаТоваров)
Или Не РеквизитыНоменклатуры.ВестиУчетПоГТД
И ХозяйственнаяОперация = ХозяйственныеОперации.РазборкаТоваров);
Если Не ПрослеживаемыйКомплект
И ЗначениеЗаполнено(НоменклатураОсновногоКомпонента)
И ХозяйственнаяОперация = ХозяйственныеОперации.СборкаТоваров Тогда
ПредставлениеОсновногоКомпонента = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
НоменклатураОсновногоКомпонента,
ХарактеристикаОсновногоКомпонента);
ОтборТоваров = Новый Структура("Номенклатура, Характеристика",
НоменклатураОсновногоКомпонента, ХарактеристикаОсновногоКомпонента);
Если Товары.НайтиСтроки(ОтборТоваров).Количество() = 0 Тогда
ТекстСообщения = НСтр("ru = 'Основной компонент `%НазваниеТовара%` в товарах не найден.
|Укажите основной компонент из перечня товаров'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НазваниеТовара%", ПредставлениеОсновногоКомпонента);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, "", "Объект", Отказ);
КонецЕсли;
Если КонтролироватьНомераГТД Тогда
КомпонентВестиУчетПоГТД =
ОбщегоНазначенияУТ.ЗначенияРеквизитовОбъектаПоУмолчанию(НоменклатураОсновногоКомпонента,"ВестиУчетПоГТД").ВестиУчетПоГТД;
Если Не КомпонентВестиУчетПоГТД Тогда
ТекстСообщения = НСтр("ru = 'По основному компоненту `%НазваниеТовара%` учет по ГТД не ведется.
|Укажите основной компонент, по которому ведется учет по ГТД.'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НазваниеТовара%", ПредставлениеОсновногоКомпонента);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, "", "Объект", Отказ);
КонецЕсли;
КонецЕсли;
ПроверятьХарактеристикуКомпонента =
ИспользоватьХарактеристики
И Не ЗначениеЗаполнено(ХарактеристикаОсновногоКомпонента)
И Справочники.Номенклатура.ХарактеристикиИспользуются(НоменклатураОсновногоКомпонента);
Если ПроверятьХарактеристикуКомпонента Тогда
ПроверяемыеРеквизиты.Добавить("ХарактеристикаОсновногоКомпонента");
КонецЕсли;
ИначеЕсли Не ПрослеживаемыйКомплект
И КонтролироватьНомераГТД
И ХозяйственнаяОперация = ХозяйственныеОперации.СборкаТоваров Тогда
ТекстСообщения = НСтр("ru = 'Требуется определять страну происхождения и номера ГТД комплекта.
|Укажите основной компонент, по которому ведется учет по ГТД.'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, "", "Объект", Отказ);
ИначеЕсли ПрослеживаемыйКомплект
И ХозяйственнаяОперация = ХозяйственныеОперации.СборкаТоваров Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Компоненты.НомерСтроки КАК НомерСтроки,
| Компоненты.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ Компоненты
|ИЗ &Компоненты КАК Компоненты
|;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| Компоненты.НомерСтроки
|ИЗ
| Компоненты КАК Компоненты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
| ПО СправочникНоменклатура.Ссылка = Компоненты.Номенклатура
|
|ГДЕ
| СправочникНоменклатура.ПрослеживаемыйТовар";
Запрос.УстановитьПараметр("Компоненты", Товары.Выгрузить( , "НомерСтроки, Номенклатура"));
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
ТекстСообщения = НСтр("ru = 'В списке ""Комплектующие"" отсутствуют прослеживаемые по РНПТ комплектующие.
|Для сборки прослеживаемого комплекта необходимо указать хотя бы одну прослеживаемую комплектующую.'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, "", "Объект", Отказ);
КонецЕсли;
ИначеЕсли (КонтролироватьНомераГТД
Или (Не ПрослеживаемыйКомплект
И ИспользоватьУчетПрослеживаемыхИмпортныхТоваров))
И ХозяйственнаяОперация = ХозяйственныеОперации.РазборкаТоваров Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Компоненты.НомерСтроки КАК НомерСтроки,
| Компоненты.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ Компоненты
|ИЗ &Компоненты КАК Компоненты
|;
|
|
|ВЫБРАТЬ
| Компоненты.НомерСтроки КАК НомерСтроки,
| ВЫБОР
| КОГДА НЕ (НЕ &ПрослеживаемыйКомплект
| И СправочникНоменклатура.ПрослеживаемыйТовар
| И &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров)
| ТОГДА &КонтролироватьНомераГТД
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ВестиУчетПоГТД,
| ВЫБОР
| КОГДА НЕ &ПрослеживаемыйКомплект
| И СправочникНоменклатура.ПрослеживаемыйТовар
| И &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ПрослеживаемыйТовар
|
|ИЗ
| Компоненты КАК Компоненты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
| ПО СправочникНоменклатура.Ссылка = Компоненты.Номенклатура
|
|ГДЕ
| СправочникНоменклатура.ВестиУчетПоГТД
| И (&КонтролироватьНомераГТД
| ИЛИ (НЕ &ПрослеживаемыйКомплект
| И СправочникНоменклатура.ПрослеживаемыйТовар
| И &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров))";
Запрос.УстановитьПараметр("Компоненты", Товары.Выгрузить( , "НомерСтроки, Номенклатура"));
Запрос.УстановитьПараметр("ПрослеживаемыйКомплект", ПрослеживаемыйКомплект);
Запрос.УстановитьПараметр("КонтролироватьНомераГТД", КонтролироватьНомераГТД);
Запрос.УстановитьПараметр("ИспользоватьУчетПрослеживаемыхИмпортныхТоваров",
ИспользоватьУчетПрослеживаемыхИмпортныхТоваров);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаПроверкиДанных = РезультатЗапроса.Выгрузить();
ТаблицаПроверкиДанных.Индексы.Добавить("ВестиУчетПоГТД");
ТаблицаПроверкиДанных.Индексы.Добавить("ПрослеживаемыйТовар");
ОтборИмпортныхТоваров = Новый Структура("ВестиУчетПоГТД", Истина);
ОтборПрослеживаемыхТоваров = Новый Структура("ПрослеживаемыйТовар", Истина);
ИмпортныеТовары = ТаблицаПроверкиДанных.НайтиСтроки(ОтборИмпортныхТоваров);
ПрослеживаемыеТовары = ТаблицаПроверкиДанных.НайтиСтроки(ОтборПрослеживаемыхТоваров);
Если ИмпортныеТовары.Количество() > 0 Тогда
ШаблонСообщения = НСтр("ru = 'Для комплектующей в строке %НомерСтроки% списка ""Комплектующие"" ведется учет по ГТД.
|Такие позиции недопустимы, если для разбираемого комплекта не ведется учет по ГТД.'");
Для Каждого СтрокаТЧ Из ИмпортныеТовары Цикл
ТекстСообщения = СтрЗаменить(ШаблонСообщения, "%НомерСтроки%", СтрокаТЧ.НомерСтроки);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТЧ.НомерСтроки, "НомерГТД");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, Поле, "Объект", Отказ);
КонецЦикла;
КонецЕсли;
Если ПрослеживаемыеТовары.Количество() > 0 Тогда
ШаблонСообщения = НСтр("ru = 'В строке %НомерСтроки% списка ""Комплектующие"" указана прослеживаемая по РНПТ комплектующая.
|Такие позиции недопустимы, если выполняется разборка непрослеживаемого комплекта.'");
Для Каждого СтрокаТЧ Из ПрослеживаемыеТовары Цикл
ТекстСообщения = СтрЗаменить(ШаблонСообщения, "%НомерСтроки%", СтрокаТЧ.НомерСтроки);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТЧ.НомерСтроки, "НомерГТД");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, Поле, "Объект", Отказ);
КонецЦикла;
КонецЕсли;
КонецЕсли;
НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект, МассивНепроверяемыхРеквизитов, Отказ);
ОтборТоваров = Новый Структура("Номенклатура, Характеристика", Номенклатура, Характеристика);
ПредставлениеКомплекта = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(Номенклатура, Характеристика);
Для Каждого СтрокаТЧ Из Товары.НайтиСтроки(ОтборТоваров) Цикл
ТекстСообщения = НСтр("ru = 'В строке %НомерСтроки% указан товар ""%НазваниеТовара%"".
|Один и тот же товар не может являться и комплектом, и комплектующей одновременно.'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НазваниеТовара%", ПредставлениеКомплекта);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НомерСтроки%", СтрокаТЧ.НомерСтроки);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТЧ.НомерСтроки, "Номенклатура");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Неопределено, Поле, "Объект", Отказ);
КонецЦикла;
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.СборкаТоваров);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ПараметрыУказанияСерий.ТЧ);
МассивПараметров.Добавить(ПараметрыУказанияСерий.Шапка);
НоменклатураСервер.ПроверитьЗаполнениеСерий(ЭтотОбъект,
МассивПараметров,
Отказ,
МассивНепроверяемыхРеквизитов);
ИсправлениеДокументов.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
СборкаТоваровЛокализация.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
ПараметрыПроверки = УчетНДСУП.ПараметрыПроверкиЗаполненияДокументаПоВидуДеятельностиНДС();
ПараметрыПроверки.ИмяТабличнойЧасти = "Товары";
УчетНДСУП.ПроверитьЗаполнениеДокументаПоВидуДеятельностиНДС(ЭтотОбъект, СборкаПодДеятельность, ПараметрыПроверки, Отказ);
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
ИсправлениеДокументов.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи, РежимПроведения);
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
ПараметрыОкругления = НоменклатураСервер.ПараметрыОкругленияКоличестваШтучныхТоваров();
ПараметрыОкругления.ИмяТЧ = "Объект";
НоменклатураСервер.ОкруглитьКоличествоШтучныхТоваров(ЭтотОбъект, РежимЗаписи, ПараметрыОкругления);
НоменклатураСервер.ОкруглитьКоличествоШтучныхТоваров(ЭтотОбъект, РежимЗаписи);
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров Тогда
Для Каждого Товар Из Товары Цикл
Если Товар.ДоляСтоимости <> 0 Тогда
Товар.ДоляСтоимости = 0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПараметрыСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.СборкаТоваров);
НоменклатураСервер.ОчиститьНеиспользуемыеСерии(ЭтотОбъект, ПараметрыСерий);
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ЗаполнитьАналитикиУчетаНоменклатуры();
ЗаполнитьВидыЗапасов(Отказ);
ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
Если Не ВидыЗапасовУказаныВручную Тогда
ВидыЗапасовСписание.Очистить();
ВидыЗапасовОприходование.Очистить();
КонецЕсли;
КонецЕсли;
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(ЭтотОбъект, "Товары,ВидыЗапасовСписание");
СборкаТоваровЛокализация.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи, РежимПроведения);
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
СборкаТоваровЛокализация.ПриЗаписи(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
СтруктураЗаполнения = Неопределено;
Распоряжение = ДокументОснованиеПриЗаполнении(ДанныеЗаполнения);
ВариантПриемкиТоваров = ЗакупкиСервер.ПолучитьВариантПриемкиТоваров(Распоряжение);
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("МассивЗаказов") Тогда
СтруктураЗаполнения = ДанныеЗаполнения;
СтруктураЗаполнения.РеквизитыШапки.Вставить("ВариантПриемкиТоваров", ВариантПриемкиТоваров);
ЗаполнитьПоЗаказу(СтруктураЗаполнения);
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.СборкаТоваров") Тогда
ИсправлениеДокументов.ЗаполнитьИсправление(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
СборкаТоваровЛокализация.ОбработкаЗаполнения(ЭтотОбъект, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка);
ИнициализироватьДокумент(ДанныеЗаполнения);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ИнициализироватьПараметрыЗаполненияВидовЗапасовДляПроведения(ЭтотОбъект);
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
СборкаТоваровЛокализация.ОбработкаПроведения(ЭтотОбъект, Отказ, РежимПроведения);
КонецПроцедуры
Процедура ОбработкаУдаленияПроведения(Отказ)
ИнициализироватьПараметрыЗаполненияВидовЗапасовДляПроведения(ЭтотОбъект);
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
СборкаТоваровЛокализация.ОбработкаУдаленияПроведения(ЭтотОбъект, Отказ);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт
СтрокаТаб = Таблица.Добавить();
СтрокаТаб.ЗначениеДоступа = Организация;
СтрокаТаб = Таблица.Добавить();
СтрокаТаб.ЗначениеДоступа = Склад;
КонецПроцедуры
Процедура ЗаполнитьПоЗаказу(СтруктураЗаполнения)
МассивЗаказов = СтруктураЗаполнения.МассивЗаказов;
ПараметрыЗаполнения = Документы.СборкаТоваров.ПараметрыЗаполненияДокумента();
ЗаполнитьЗначенияСвойств(ПараметрыЗаполнения, СтруктураЗаполнения);
Документы.СборкаТоваров.ИнициализироватьПараметрыЗаполнения(ПараметрыЗаполнения, СтруктураЗаполнения.РеквизитыШапки,
МассивЗаказов);
Документы.СборкаТоваров.ЗаполнитьШапкуДокументаПоЗаказу(ЭтотОбъект, ПараметрыЗаполнения, МассивЗаказов);
ТаблицаНакладная = Документы.СборкаТоваров.ДанныеТаблицыТоварыДокумента(ЭтотОбъект.Ссылка);
ТаблицаНакладнаяПоШапке = Документы.СборкаТоваров.ДанныеТаблицыТоварыДокумента(ЭтотОбъект.Ссылка, Истина);
Ресурсы = Новый Массив(1);
Ресурсы[0] = "Комплект";
ПараметрыЗаполнения.Ресурсы = Ресурсы;
Документы.СборкаТоваров.ЗаполнитьПоЗаказамОрдерам(ТаблицаНакладнаяПоШапке, Ссылка, ПараметрыЗаполнения, ШтрихкодыУпаковок);
Ресурсы[0] = "Комплектующие";
ПараметрыЗаполнения.Ресурсы = Ресурсы;
Документы.СборкаТоваров.ЗаполнитьПоЗаказамОрдерам(ТаблицаНакладная, Ссылка, ПараметрыЗаполнения, ШтрихкодыУпаковок);
Если ПараметрыЗаполнения.ЗаполнятьПоОрдеру Тогда
ТаблицаНакладнаяПоШапке.Колонки.Количество.Имя = "КоличествоДоИзменения";
ТаблицаНакладнаяПоШапке.Колонки.КоличествоВОрдере.Имя = "Количество";
ТаблицаНакладная.Колонки.Количество.Имя = "КоличествоДоИзменения";
ТаблицаНакладная.Колонки.КоличествоВОрдере.Имя = "Количество";
Иначе
ТаблицаНакладнаяПоШапке.Колонки.Количество.Имя = "КоличествоДоИзменения";
ТаблицаНакладнаяПоШапке.Колонки.КоличествоВЗаказе.Имя = "Количество";
ТаблицаНакладная.Колонки.Количество.Имя = "КоличествоДоИзменения";
ТаблицаНакладная.Колонки.КоличествоВЗаказе.Имя = "Количество";
КонецЕсли;
Товары.Загрузить(ТаблицаНакладная);
Документы.СборкаТоваров.ПерезаполнитьТоварыВШапке(ЭтотОбъект, ТаблицаНакладнаяПоШапке, МассивЗаказов[0]);
Документы.СборкаТоваров.ОбновитьЗависимыеРеквизитыТабличнойЧасти(Товары, ПараметрыЗаполнения);
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.СборкаТоваров);
НоменклатураСервер.ЗаполнитьСерииПоFEFO(ЭтотОбъект, ПараметрыУказанияСерий.ТЧ, Ложь);
НоменклатураСервер.ЗаполнитьСерииПоFEFO(ЭтотОбъект, ПараметрыУказанияСерий.Шапка, Ложь);
ЗаказНаСборку = МассивЗаказов[0];
Если Не ПараметрыЗаполнения.ЗаполнятьПоОрдеру
И ЗначениеЗаполнено(ЗаказНаСборку) И ЗначениеЗаполнено(ВариантКомплектации)
И ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РазборкаТоваров Тогда
ЗаполнитьДолиСтоимости();
КонецЕсли;
Если ПараметрыЗаполнения.ЗаполнятьПоОрдеру Тогда
Статус = Перечисления.СтатусыСборокТоваров.СобраноРазобрано;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДолиСтоимости()
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ЗаказНаСборку", ЗаказНаСборку);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Таблица.КОформлениюПоступленийПоОрдерамРасход
|ИЗ
| РегистрНакопления.ТоварыКПоступлению.Обороты(, , , ДокументПоступления = &ЗаказНаСборку) КАК Таблица";
Если Запрос.Выполнить().Пустой() Тогда
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.УстановитьПараметр("КоличествоКомплектов", Количество);
Запрос.УстановитьПараметр("ВариантКомплектации", ВариантКомплектации);
Запрос.УстановитьПараметр("Товары", Товары.Выгрузить(,"НомерСтроки, Номенклатура, Характеристика, Упаковка, Количество"));
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.НомерСтроки КАК НомерСтроки,
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Упаковка КАК Упаковка,
| Таблица.Количество КАК Количество
|ПОМЕСТИТЬ ВтТовары
|ИЗ
| &Товары КАК Таблица
|;
|
|
|ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Упаковка КАК Упаковка,
| &КоличествоКомплектов * Таблица.Количество * ВЫБОР
| КОГДА Таблица.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА 1
| ИНАЧЕ &ТекстЗапросаКоэффициентУпаковки
| КОНЕЦ / Таблица.Ссылка.Количество КАК Количество,
| Таблица.ДоляСтоимости КАК ДоляСтоимости
|ПОМЕСТИТЬ ВтВариантыКомплектации
|ИЗ
| Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК Таблица
|ГДЕ
| Таблица.Ссылка = &ВариантКомплектации
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика,
| Упаковка
|;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| Набор.Номенклатура КАК Номенклатура,
| Набор.Характеристика КАК Характеристика,
| Набор.Упаковка КАК Упаковка,
| СУММА(Набор.Количество) КАК Количество,
| СУММА(Набор.ЕстьТовар) КАК ЕстьТовар
|ПОМЕСТИТЬ ВтЕстьОтклонения
|ИЗ
|(
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Упаковка КАК Упаковка,
| -Таблица.Количество КАК Количество,
| 1 КАК ЕстьТовар
| ИЗ
| ВтТовары КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Характеристика КАК Характеристика,
| Таблица.Упаковка КАК Упаковка,
| Таблица.Количество КАК Количество,
| 1 КАК ЕстьТовар
| ИЗ
| ВтВариантыКомплектации КАК Таблица) КАК Набор
|
|СГРУППИРОВАТЬ ПО
| Номенклатура,
| Характеристика,
| Упаковка
|
|ИМЕЮЩИЕ
| СУММА(Набор.Количество) <> 0 ИЛИ СУММА(Набор.ЕстьТовар) <> 2
|;
|
|
|ВЫБРАТЬ
| Таблица.НомерСтроки КАК НомерСтроки,
| ТаблицаКомплектации.ДоляСтоимости КАК ДоляСтоимости
|ИЗ
| ВтТовары КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ ВтВариантыКомплектации КАК ТаблицаКомплектации
| ПО Таблица.Номенклатура = ТаблицаКомплектации.Номенклатура
| И Таблица.Характеристика = ТаблицаКомплектации.Характеристика
| И Таблица.Упаковка = ТаблицаКомплектации.Упаковка
| И Таблица.Количество = ТаблицаКомплектации.Количество
| ЛЕВОЕ СОЕДИНЕНИЕ ВтЕстьОтклонения КАК ВтЕстьОтклонения
| ПО ИСТИНА
|
|ГДЕ
| НЕ ТаблицаКомплектации.ДоляСтоимости ЕСТЬ NULL
| И ВтЕстьОтклонения.ЕстьТовар ЕСТЬ NULL";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"&ТекстЗапросаКоэффициентУпаковки",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
"Таблица.Упаковка",
"Таблица.Номенклатура"));
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаТаблицыТовары = Товары[Выборка.НомерСтроки - 1];
СтрокаТаблицыТовары.ДоляСтоимости = Выборка.ДоляСтоимости;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
Склад = ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(Склад);
Ответственный = Пользователи.ТекущийПользователь();
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПользователя(Ответственный, Подразделение);
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыСборокТоваров") Тогда
Статус = Перечисления.СтатусыСборокТоваров.СобраноРазобрано;
КонецЕсли;
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.СборкаТоваров);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, ПараметрыУказанияСерий.ТЧ);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, ПараметрыУказанияСерий.Шапка);
ПараметрыЗаполнения = Документы.СборкаТоваров.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(СборкаПодДеятельность, ПараметрыЗаполнения);
КонецПроцедуры
Функция ДокументОснованиеПриЗаполнении(ДанныеЗаполнения)
Если ДанныеЗаполнения = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура")
И ДанныеЗаполнения.Свойство("МассивЗаказов") Тогда
Возврат ДанныеЗаполнения.МассивЗаказов[0];
КонецЕсли;
Возврат Неопределено;
КонецФункции
#Область ВидыЗапасов
Функция СформироватьТаблицуТоваров(РеквизитыШапки)
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("КодСтроки", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("АналитикаУчетаНоменклатуры", Новый ОписаниеТипов("СправочникСсылка.КлючиАналитикиУчетаНоменклатуры"));
ТаблицаТоваров.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаТоваров.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
ТаблицаТоваров.Колонки.Добавить("Назначение", Новый ОписаниеТипов("СправочникСсылка.Назначения"));
ТаблицаТоваров.Колонки.Добавить("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
ТаблицаТоваров.Колонки.Добавить("СтатусУказанияСерий", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("КоличествоПоРНПТ", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("НомерГТД", Новый ОписаниеТипов("СправочникСсылка.НомераГТД"));
ЗаполнитьЗначенияСвойств(ТаблицаТоваров.Добавить(), РеквизитыШапки);
ТаблицаТоваров[0].НомерСтроки = 1;
Возврат ТаблицаТоваров;
КонецФункции
Процедура СформироватьВременнуюТаблицуТоваровИАналитики(МенеджерВременныхТаблиц) Экспорт
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ТаблицаТоваров.АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Номенклатура,
| ТаблицаТоваров.Характеристика,
| ВЫБОР
| КОГДА ТаблицаТоваров.СтатусУказанияСерий = 14
| ТОГДА ТаблицаТоваров.Серия
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
| КОНЕЦ КАК Серия,
| ТаблицаТоваров.Склад,
|
| ТаблицаДанныхДокумента.Подразделение,
| ТаблицаДанныхДокумента.Менеджер,
| ТаблицаДанныхДокумента.Сделка,
| ТаблицаТоваров.Назначение КАК Назначение,
|
| ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка) КАК Партнер,
| ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка) КАК Соглашение,
| ЗНАЧЕНИЕ(Перечисление.ТипыНалогообложенияНДС.ПустаяСсылка) КАК НалогообложениеНДС,
|
| ТаблицаТоваров.Количество КАК Количество
|
|ПОМЕСТИТЬ ТаблицаТоваровИАналитики
|ИЗ
| ТаблицаТоваров КАК ТаблицаТоваров
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| ТаблицаДанныхДокумента КАК ТаблицаДанныхДокумента
| ПО
| ИСТИНА
|;
|");
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Выполнить();
КонецПроцедуры
Процедура ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров(ТаблицыДокумента = Неопределено)
Если ТаблицыДокумента = Неопределено Тогда
ТаблицыДокумента = Документы.СборкаТоваров.КоллекцияТабличныхЧастейТоваров();
ЗаполнитьЗначенияСвойств(ТаблицыДокумента, ЭтотОбъект);
КонецЕсли;
ТаблицаТовары = ТаблицыДокумента.Товары;
МестаУчета = РегистрыСведений.АналитикаУчетаНоменклатуры.МестаУчета(
Перечисления.ХозяйственныеОперации.СборкаТоваров,
Склад,
Подразделение,
Неопределено);
РегистрыСведений.АналитикаУчетаНоменклатуры.ЗаполнитьВКоллекции(ТаблицаТовары, МестаУчета);
КонецПроцедуры
Функция АналитикаУчетаНоменклатурыШапкиДокумента()
ШапкаДокумента = СформироватьТаблицуТоваров(ЭтотОбъект);
МестаУчета = РегистрыСведений.АналитикаУчетаНоменклатуры.МестаУчета(
Перечисления.ХозяйственныеОперации.СборкаТоваров,
Склад,
Подразделение,
Неопределено);
РегистрыСведений.АналитикаУчетаНоменклатуры.ЗаполнитьВКоллекции(ШапкаДокумента, МестаУчета);
Возврат ШапкаДокумента[0].АналитикаУчетаНоменклатуры;
КонецФункции
Функция ПроверитьИзменениеРеквизитовДокументаСписание(МенеджерВременныхТаблиц)
ИменаРеквизитов = "Организация, Дата, Склад, Статус";
Возврат ЗапасыСервер.ПроверитьИзменениеРеквизитовДокумента(МенеджерВременныхТаблиц, Ссылка, ИменаРеквизитов);
КонецФункции
Функция ПроверитьИзменениеРеквизитовДокументаОприходование(МенеджерВременныхТаблиц)
ИменаРеквизитов = "НоменклатураОсновногоКомпонента, ХарактеристикаОсновногоКомпонента";
Возврат ЗапасыСервер.ПроверитьИзменениеРеквизитовДокумента(МенеджерВременныхТаблиц, Ссылка, ИменаРеквизитов);
КонецФункции
Функция ПроверитьИзменениеСписываемыхТоваров(МенеджерВременныхТаблиц)
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры
|ИЗ (
| ВЫБРАТЬ
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Назначение КАК Назначение,
| ТаблицаТоваров.Количество КАК Количество
| ИЗ
| ТаблицаТоваров КАК ТаблицаТоваров
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.Назначение КАК Назначение,
| -ТаблицаВидыЗапасов.Количество КАК Количество
| ИЗ
| ТаблицаВидыЗапасов КАК ТаблицаВидыЗапасов
|
| ) КАК ТаблицаТоваров
|
|СГРУППИРОВАТЬ ПО
| ТаблицаТоваров.АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Назначение
|
|ИМЕЮЩИЕ
| СУММА(ТаблицаТоваров.Количество) <> 0
|");
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
РезультатЗапрос = Запрос.Выполнить();
Возврат (Не РезультатЗапрос.Пустой());
КонецФункции
Функция ПроверитьИзменениеОприходуемыхТоваров(МенеджерВременныхТаблиц)
Запрос = Новый Запрос("
|ВЫБРАТЬ
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры
|ИЗ (
| ВЫБРАТЬ
| ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаТоваров.Назначение КАК Назначение,
| ТаблицаТоваров.Количество КАК Количество
| ИЗ
| ВтТаблицаТоваровОприходование КАК ТаблицаТоваров
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры.Назначение КАК Назначение,
| -ТаблицаВидыЗапасов.Количество КАК Количество
| ИЗ
| ВтВидыЗапасовОприходование КАК ТаблицаВидыЗапасов
|
| ) КАК ТаблицаТоваров
|
|СГРУППИРОВАТЬ ПО
| ТаблицаТоваров.Назначение,
| ТаблицаТоваров.АналитикаУчетаНоменклатуры
|
|ИМЕЮЩИЕ
| СУММА(ТаблицаТоваров.Количество) <> 0
|");
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
РезультатЗапрос = Запрос.Выполнить();
Возврат (Не РезультатЗапрос.Пустой());
КонецФункции
Процедура ЗаполнитьВидыЗапасов(Отказ)
УстановитьПривилегированныйРежим(Истина);
МенеджерВременныхТаблиц = ВременныеТаблицыДанныхДокумента();
ПерезаполнитьВидыЗапасов = ЗапасыСервер.ПроверитьНеобходимостьПерезаполненияВидовЗапасовДокумента(ЭтотОбъект);
ВидыЗапасовСписаниеПерезаполнены = Ложь;
Если Не Проведен
Или ПерезаполнитьВидыЗапасов
Или ПроверитьИзменениеРеквизитовДокументаСписание(МенеджерВременныхТаблиц)
Или ПроверитьИзменениеСписываемыхТоваров(МенеджерВременныхТаблиц) Тогда
ПараметрыЗаполнения = ПараметрыЗаполненияВидовЗапасов();
ЗапасыСервер.ЗаполнитьВидыЗапасовПоТоварамОрганизаций(ЭтотОбъект,
МенеджерВременныхТаблиц,
Отказ,
ПараметрыЗаполнения);
ВидыЗапасовСписание.Свернуть("АналитикаУчетаНоменклатуры, ВидЗапасов, НомерГТД", "Количество, КоличествоПоРНПТ");
ПараметрыПоиска = Новый Структура("Количество", 0);
МассивУдаляемыхСтрок = ВидыЗапасовСписание.НайтиСтроки(ПараметрыПоиска);
Для Каждого СтрокаТаблицы Из МассивУдаляемыхСтрок Цикл
ВидыЗапасовСписание.Удалить(СтрокаТаблицы);
КонецЦикла;
ВидыЗапасовСписаниеПерезаполнены = Истина;
КонецЕсли;
Если Не Проведен
Или ПерезаполнитьВидыЗапасов
Или ВидыЗапасовСписаниеПерезаполнены
Или ПроверитьИзменениеРеквизитовДокументаОприходование(МенеджерВременныхТаблиц)
Или ПроверитьИзменениеОприходуемыхТоваров(МенеджерВременныхТаблиц) Тогда
ВидыЗапасовОприходование.Очистить();
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров Тогда
ЗаполнитьЗначенияСвойств(ВидыЗапасовОприходование.Добавить(), ЭтотОбъект);
ИначеЕсли ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РазборкаТоваров Тогда
Для Каждого СтрокаТовары Из Товары Цикл
ЗаполнитьЗначенияСвойств(ВидыЗапасовОприходование.Добавить(), СтрокаТовары);
КонецЦикла;
КонецЕсли;
ЗапасыСервер.ЗаполнитьВидыЗапасовПоУмолчанию(МенеджерВременныхТаблиц, ВидыЗапасовОприходование);
РаспределитьНомераГТД(Отказ);
КонецЕсли;
КонецПроцедуры
Процедура РаспределитьНомераГТД(Отказ) Экспорт
ПараметрыПроверки = УчетПрослеживаемыхТоваровЛокализация.ПараметрыПроверкиПрослеживаемыхНомеровГТД();
ПараметрыПроверки.ИмяТЧ = "ВидыЗапасовСписание";
УчетПрослеживаемыхТоваровЛокализация.ПроверитьКорректностьПрослеживаемыхНомеровГТД(ЭтотОбъект, Отказ, ПараметрыПроверки);
Если Отказ Тогда
Возврат;
КонецЕсли;
ВидыЗапасовДляСозданияСоставныхНомеровГТД = ВидыЗапасовСписание.Выгрузить();
Если ВидыЗапасовДляСозданияСоставныхНомеровГТД.Количество() > 0 Тогда
ЭтоСборка = ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров;
ТипыНомеровГТДВТаблице = ЗакупкиСервер.ТипыНомеровГТДВТаблице(ВидыЗапасовДляСозданияСоставныхНомеровГТД);
ПрослеживаемыйКомплект =
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "ПрослеживаемыйТовар")
И УчетПрослеживаемыхТоваровЛокализация.ИспользоватьУчетПрослеживаемыхИмпортныхТоваров(Дата);
ЕстьПрослеживаемыеКомплектующие = 0;
Если Не ЭтоСборка
И ПрослеживаемыйКомплект Тогда
Комплектующие = Товары.ВыгрузитьКолонку("Номенклатура");
Комплектующие = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Комплектующие);
ДанныеКомплектующих = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(Комплектующие, "ПрослеживаемыйТовар");
Для Каждого КлючИЗначение Из ДанныеКомплектующих Цикл
Если КлючИЗначение.Значение Тогда
ЕстьПрослеживаемыеКомплектующие = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЭтоСборка
И ПрослеживаемыйКомплект
И ТипыНомеровГТДВТаблице.КоличествоПрослеживаемыхНомеровГТД
+ ТипыНомеровГТДВТаблице.КоличествоСоставныхНомеровГТД > 1 Тогда
РаспределитьНомераГТДПрослеживаемыеСборка(Отказ);
ИначеЕсли ЭтоСборка
И ПрослеживаемыйКомплект
И ТипыНомеровГТДВТаблице.КоличествоСоставныхНомеровГТД = 1
И ТипыНомеровГТДВТаблице.КоличествоПрослеживаемыхНомеровГТД = 0 Тогда
РаспределитьНомераГТДПрослеживаемыеПеренос();
ИначеЕсли ЭтоСборка
И ПрослеживаемыйКомплект
И ТипыНомеровГТДВТаблице.КоличествоСоставныхНомеровГТД = 0
И ТипыНомеровГТДВТаблице.КоличествоПрослеживаемыхНомеровГТД = 1 Тогда
РаспределитьНомераГТДПрослеживаемыеСборка(Отказ);
ИначеЕсли Не ЭтоСборка
И ПрослеживаемыйКомплект
И ЕстьПрослеживаемыеКомплектующие
И ТипыНомеровГТДВТаблице.КоличествоПрослеживаемыхНомеровГТД = 1
И ТипыНомеровГТДВТаблице.КоличествоСоставныхНомеровГТД = 0 Тогда
РаспределитьНомераГТДПрослеживаемыеПеренос();
ИначеЕсли Не ЭтоСборка
И ЕстьПрослеживаемыеКомплектующие
И ТипыНомеровГТДВТаблице.ЕстьСоставнойНомерГТД Тогда
РаспределитьНомераГТДПрослеживаемыеРазборка(Отказ);
ИначеЕсли ПрослеживаемыйКомплект
И Не ЕстьПрослеживаемыеКомплектующие Тогда
ТекстСообщения = НСтр("ru = 'Отсутствуют прослеживаемые по РНПТ комплектующие при прослеживаемом комплекте.
|Будет произведено выбытие прослеживаемого комплекта.'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
ИначеЕсли Не ПрослеживаемыйКомплект
И ТипыНомеровГТДВТаблице.ЕстьПрослеживаемыйНомерГТД Тогда
ТекстСообщения = НСтр("ru = 'Имеется прослеживаемая по РНПТ комплектующая при непрослеживаемом комплекте.
|Будет произведено выбытие прослеживаемых комплектующих.'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Иначе
РаспределитьНомераГТДНеПрослеживаемые();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура РаспределитьНомераГТДПрослеживаемыеПеренос()
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ВидыЗапасовСписание.АналитикаУчетаНоменклатуры КАК Справочник.КлючиАналитикиУчетаНоменклатуры) КАК АналитикаУчетаНоменклатуры,
| ВЫРАЗИТЬ(ВидыЗапасовСписание.НомерГТД КАК Справочник.НомераГТД) КАК НомерГТД,
| ВЫРАЗИТЬ(ВидыЗапасовСписание.ВидЗапасов КАК Справочник.ВидыЗапасов) КАК ВидЗапасов,
| ВЫРАЗИТЬ(ВидыЗапасовСписание.КоличествоПоРНПТ КАК ЧИСЛО(23, 11)) КАК КоличествоПоРНПТ,
| ВидыЗапасовСписание.ИдентификаторСтроки
|ПОМЕСТИТЬ ВтВидыЗапасовСписание
|ИЗ
| &ВидыЗапасовСписание КАК ВидыЗапасовСписание
|;
|
|ВЫБРАТЬ
| ВЫРАЗИТЬ(ВидыЗапасовОприходование.АналитикаУчетаНоменклатуры КАК Справочник.КлючиАналитикиУчетаНоменклатуры) КАК АналитикаУчетаНоменклатуры,
| ВЫРАЗИТЬ(ВидыЗапасовОприходование.ВидЗапасов КАК Справочник.ВидыЗапасов) КАК ВидЗапасов
|ПОМЕСТИТЬ ВтВидыЗапасовОприходование
|ИЗ
| &ВидыЗапасовОприходование КАК ВидыЗапасовОприходование
|;
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Списание.АналитикаУчетаНоменклатуры,
| Списание.НомерГТД,
| Списание.КоличествоПоРНПТ,
| Списание.ВидЗапасов,
| Списание.ИдентификаторСтроки
|ИЗ
| ВтВидыЗапасовСписание КАК Списание
|ГДЕ
| Списание.НомерГТД.ТипНомераГТД = ЗНАЧЕНИЕ(Перечисление.ТипыНомеровГТД.НомерРНПТ)
| ИЛИ Списание.НомерГТД.ТипНомераГТД = ЗНАЧЕНИЕ(Перечисление.ТипыНомеровГТД.НомерРНПТКомплекта)
|;
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Оприходование.АналитикаУчетаНоменклатуры,
| Оприходование.ВидЗапасов
|ИЗ
| ВтВидыЗапасовОприходование КАК Оприходование
|ГДЕ
| Оприходование.АналитикаУчетаНоменклатуры.Номенклатура.ПрослеживаемыйТовар
|";
Запрос.УстановитьПараметр("ВидыЗапасовСписание", ВидыЗапасовСписание.Выгрузить());
Запрос.УстановитьПараметр("ВидыЗапасовОприходование", ВидыЗапасовОприходование.Выгрузить());
Результат = Запрос.ВыполнитьПакет();
КСписанию = Результат[2].Выгрузить();
КОприходованию = Результат[3].Выгрузить();
НайденныеСтрокиОприходования = Новый Массив();
ОтборСтрок = Новый Структура("АналитикаУчетаНоменклатуры, ВидЗапасов");
Для Каждого Строка Из КОприходованию Цикл
ЗаполнитьЗначенияСвойств(ОтборСтрок, Строка);
СтрокиОприходования = ВидыЗапасовОприходование.НайтиСтроки(ОтборСтрок);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(НайденныеСтрокиОприходования, СтрокиОприходования);
КонецЦикла;
НомерГТДКСписанию = КСписанию[0].НомерГТД;
КоличествоПоРНПТКСписанию = КСписанию.Итог("КоличествоПоРНПТ");
КоличествоСтрокОприходования = НайденныеСтрокиОприходования.Количество();
ДоляКРаспределению = КоличествоПоРНПТКСписанию / КоличествоСтрокОприходования;
ОстатокОтРаспределения = КоличествоПоРНПТКСписанию - (ДоляКРаспределению * КоличествоСтрокОприходования);
Для Каждого СтрокаКОприходованию Из НайденныеСтрокиОприходования Цикл
СтрокаКОприходованию = СтрокаКОприходованию;
СтрокаКОприходованию.НомерГТД = НомерГТДКСписанию;
СтрокаКОприходованию.КоличествоПоРНПТ = ДоляКРаспределению;
КонецЦикла;
СтрокаКОприходованию.КоличествоПоРНПТ = СтрокаКОприходованию.КоличествоПоРНПТ + ОстатокОтРаспределения;
КонецПроцедуры
Процедура РаспределитьНомераГТДПрослеживаемыеСборка(Отказ)
ИменаКолонок = "АналитикаУчетаНоменклатуры, НомерГТД, Количество, КоличествоПоРНПТ";
ТаблицаПроселживаемости = ЗакупкиСервер.ПолучитьПрослеживаемыеНомераГТД(ВидыЗапасовСписание.Выгрузить(, ИменаКолонок));
ПараметрыСоздания = ЗакупкиСервер.ПараметрыПоискаИлиСозданияСоставныхПрослеживаемыхКомплектов();
ПараметрыСоздания.ИзвлечьНоменклатуруИзОбъектаВКолонке = ТаблицаПроселживаемости.Колонки.АналитикаУчетаНоменклатуры.Имя;
ПараметрыСоздания.ИзвлечьХарактеристикуИзОбъектаВКолонке = ТаблицаПроселживаемости.Колонки.АналитикаУчетаНоменклатуры.Имя;
ПараметрыСоздания.ИзвлечьСериюИзОбъектаВКолонке = ТаблицаПроселживаемости.Колонки.АналитикаУчетаНоменклатуры.Имя;
ПараметрыСоздания.НоменклатураШапки = Номенклатура;
ПараметрыСоздания.ХарактеристикаШапки = Характеристика;
ПараметрыСоздания.СерияШапки = Серия;
СоставныеПрослеживаемыеНомераГТД = ЗакупкиСервер.НайтиИлиСоздатьСоставныеПрослеживаемыеНомераГТД(ТаблицаПроселживаемости,
Количество,
Дата,
Отказ,
ПараметрыСоздания);
ЗапасОприходование = ВидыЗапасовОприходование[0];
КоличествоПоРНПТ = ЗапасОприходование.КоличествоПоРНПТ;
Если КоличествоПоРНПТ = 0 Тогда
КоличествоПоРНПТ = ЗапасОприходование.Количество;
КонецЕсли;
Если СоставныеПрослеживаемыеНомераГТД.ОстаточныйСоставнойНомерГТД = Неопределено Тогда
ЗапасОприходование.НомерГТД = СоставныеПрослеживаемыеНомераГТД.ОсновнойСоставнойНомерГТД;
ЗапасОприходование.КоличествоПоРНПТ = КоличествоПоРНПТ;
Иначе
ЕдиницаРНПТ = ЗапасОприходование.Количество / КоличествоПоРНПТ;
ЗапасОприходование.НомерГТД = СоставныеПрослеживаемыеНомераГТД.ОсновнойСоставнойНомерГТД;
ЗапасОприходование.Количество = ЗапасОприходование.Количество - 1;
ЗапасОприходование.КоличествоПоРНПТ = КоличествоПоРНПТ - ЕдиницаРНПТ;
НоваяСтрока = ВидыЗапасовОприходование.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ЗапасОприходование);
НоваяСтрока.НомерГТД = СоставныеПрослеживаемыеНомераГТД.ОстаточныйСоставнойНомерГТД;
НоваяСтрока.Количество = 1;
НоваяСтрока.КоличествоПоРНПТ = ЕдиницаРНПТ;
КонецЕсли;
КонецПроцедуры
Процедура РаспределитьНомераГТДПрослеживаемыеРазборка(Отказ)
ТоварыКСписанию = ВидыЗапасовСписание.Выгрузить();
ТоварыКОприходованию = ВидыЗапасовОприходование.Выгрузить();
Результат = ЗакупкиСервер.РазобратьСоставныеПрослеживаемыеНомераГТД(ТоварыКСписанию,
ТоварыКОприходованию,
Неопределено,
Неопределено,
Отказ);
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаДокумента.ВидЗапасов,
| ТаблицаДокумента.НомерГТД,
| ТаблицаДокумента.КоличествоПоРНПТ,
| ТаблицаДокумента.Количество,
| ТаблицаДокумента.АналитикаУчетаНоменклатуры
|ПОМЕСТИТЬ ВТТаблицаДокумента
|ИЗ
| &ТаблицаДокумента КАК ТаблицаДокумента
|ИНДЕКСИРОВАТЬ ПО
| АналитикаУчетаНоменклатуры,
| ВидЗапасов
|;
|
|ВЫБРАТЬ
| ТаблицаРаспределения.ВидЗапасов,
| ТаблицаРаспределения.НомерГТД,
| ТаблицаРаспределения.КоличествоПоРНПТ,
| ТаблицаРаспределения.Количество,
| ТаблицаРаспределения.АналитикаУчетаНоменклатуры
|ПОМЕСТИТЬ ВТТаблицаРаспределения
|ИЗ
| &ТаблицаРаспределения КАК ТаблицаРаспределения
|ИНДЕКСИРОВАТЬ ПО
| АналитикаУчетаНоменклатуры,
| ВидЗапасов
|
|;
|ВЫБРАТЬ
| ТаблицаДокумента.ВидЗапасов,
| ТаблицаДокумента.НомерГТД,
| ТаблицаДокумента.КоличествоПоРНПТ,
| ТаблицаДокумента.Количество,
| ТаблицаДокумента.АналитикаУчетаНоменклатуры
|ИЗ
| ВТТаблицаДокумента КАК ТаблицаДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ ВТТаблицаРаспределения КАК ТаблицаРаспределения
| ПО ТаблицаДокумента.АналитикаУчетаНоменклатуры = ТаблицаРаспределения.АналитикаУчетаНоменклатуры
| И ТаблицаДокумента.ВидЗапасов = ТаблицаРаспределения.ВидЗапасов
|ГДЕ
| ТаблицаРаспределения.АналитикаУчетаНоменклатуры ЕСТЬ NULL
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТаблицаРаспределения.ВидЗапасов,
| ТаблицаРаспределения.НомерГТД,
| ТаблицаРаспределения.КоличествоПоРНПТ,
| ТаблицаРаспределения.Количество,
| ТаблицаРаспределения.АналитикаУчетаНоменклатуры
|ИЗ
| ВТТаблицаРаспределения КАК ТаблицаРаспределения";
Запрос.УстановитьПараметр("ТаблицаДокумента", ТоварыКОприходованию);
Запрос.УстановитьПараметр("ТаблицаРаспределения", Результат);
ТоварыКОприходованиюРаспределенные = Запрос.Выполнить().Выгрузить();
ВидыЗапасовОприходование.Загрузить(ТоварыКОприходованиюРаспределенные);
КонецПроцедуры
Процедура РаспределитьНомераГТДНеПрослеживаемые()
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| &ИспользоватьУчетПрослеживаемыхИмпортныхТоваров
| И НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) >= &ДатаНачалаУчетаПрослеживаемыхИмпортныхТоваров
| И ЕСТЬNULL(ВЫРАЗИТЬ(&Номенклатура КАК Справочник.Номенклатура).ПрослеживаемыйТовар, ЛОЖЬ) КАК ИспользуетсяУчетПрослеживаемыхТоваров";
УчетПрослеживаемыхТоваровЛокализация.УстановитьПараметрыИспользованияУчетаПрослеживаемыхТоваров(Запрос);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Дата", Дата);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
РаспределятьТолькоНаПрослеживаемыеТовары = Выборка.ИспользуетсяУчетПрослеживаемыхТоваров;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АналитикаУчетаНоменклатуры.Ссылка КАК КлючАналитики,
| ВЫБОР
| КОГДА АналитикаУчетаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.КоличествоШтук)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ШтучнаяЕдиница,
| ЕСТЬNULL(АналитикаУчетаНоменклатуры.Номенклатура.ВестиУчетПоГТД, ЛОЖЬ) КАК УчетПоГТД,
| ЕСТЬNULL(АналитикаУчетаНоменклатуры.Номенклатура.ПрослеживаемыйТовар, ЛОЖЬ) КАК УчетПоРНПТ
|ИЗ
| Справочник.КлючиАналитикиУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры
|ГДЕ
| АналитикаУчетаНоменклатуры.Ссылка В(&КлючиАналитики)";
Запрос.УстановитьПараметр("КлючиАналитики", ВидыЗапасовОприходование.ВыгрузитьКолонку("АналитикаУчетаНоменклатуры"));
Выборка = Запрос.Выполнить().Выбрать();
ДанныеАналитикУчета = Новый Соответствие;
Пока Выборка.Следующий() Цикл
ДанныеАналитикУчета.Вставить(Выборка.КлючАналитики,
Новый Структура("УчетПоГТД, УчетПоРНПТ, ШтучнаяЕдиница",
Выборка.УчетПоГТД, Выборка.УчетПоРНПТ, Выборка.ШтучнаяЕдиница));
КонецЦикла;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыЗапасов.АналитикаУчетаНоменклатуры,
| ВидыЗапасов.Количество,
| ВидыЗапасов.КоличествоПоРНПТ,
| ВидыЗапасов.НомерГТД
|ПОМЕСТИТЬ ВтВидыЗапасов
|ИЗ
| &ВидыЗапасов КАК ВидыЗапасов
|;
|
|
|ВЫБРАТЬ
| ВидыЗапасов.Количество,
| ВидыЗапасов.КоличествоПоРНПТ,
| ВидыЗапасов.НомерГТД
|ИЗ
| ВтВидыЗапасов КАК ВидыЗапасов";
Запрос.УстановитьПараметр("ВидыЗапасов", ВидыЗапасовСписание);
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.СборкаТоваров Тогда
Запрос.Текст = Запрос.Текст + "
|ГДЕ
| ВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура = &Номенклатура
| И ВидыЗапасов.АналитикаУчетаНоменклатуры.Характеристика = &Характеристика";
Запрос.УстановитьПараметр("Номенклатура", НоменклатураОсновногоКомпонента);
Запрос.УстановитьПараметр("Характеристика", ХарактеристикаОсновногоКомпонента);
КонецЕсли;
СписываемыеЗапасы = Запрос.Выполнить().Выгрузить();
Индекс = ВидыЗапасовОприходование.Количество() - 1;
Пока Индекс >= 0 Цикл
ЗапасОприходование = ВидыЗапасовОприходование[Индекс];
ДанныеАналитики = ДанныеАналитикУчета.Получить(ЗапасОприходование.АналитикаУчетаНоменклатуры);
Если Не ДанныеАналитики.УчетПоГТД Тогда
ЗапасОприходование.НомерГТД = Неопределено;
Индекс = Индекс - 1;
Продолжить;
КонецЕсли;
Если РаспределятьТолькоНаПрослеживаемыеТовары
И Не ДанныеАналитики.УчетПоРНПТ Тогда
ЗапасОприходование.НомерГТД = Неопределено;
Индекс = Индекс - 1;
Продолжить;
КонецЕсли;
Разрядность = ?(ДанныеАналитики.ШтучнаяЕдиница
И Цел(ЗапасОприходование.Количество) = ЗапасОприходование.Количество
И Не РаспределятьТолькоНаПрослеживаемыеТовары,
0,
3);
ОсталосьРаспределить = ЗапасОприходование.Количество;
ВсегоКоличество = СписываемыеЗапасы.Итог("Количество");
ВсегоКоличествоПоРНПТ = СписываемыеЗапасы.Итог("КоличествоПоРНПТ");
Для Каждого ЗапасСписание Из СписываемыеЗапасы Цикл
ЗапасОприходование.Количество = Окр(ОсталосьРаспределить * ЗапасСписание.Количество / ВсегоКоличество,
Разрядность,
1);
Если ДанныеАналитики.УчетПоРНПТ Тогда
ЗапасОприходование.КоличествоПоРНПТ = ЗапасСписание.КоличествоПоРНПТ;
КонецЕсли;
ЗапасОприходование.НомерГТД = ЗапасСписание.НомерГТД;
ОсталосьРаспределить = ОсталосьРаспределить - ЗапасОприходование.Количество;
ВсегоКоличество = ВсегоКоличество - ЗапасСписание.Количество;
ВсегоКоличествоПоРНПТ = ВсегоКоличествоПоРНПТ - ЗапасСписание.КоличествоПоРНПТ;
Если ОсталосьРаспределить <> 0 Тогда
ЗаполнитьЗначенияСвойств(ВидыЗапасовОприходование.Вставить(Индекс), ЗапасОприходование);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Прочее
Функция ПараметрыЗаполненияВидовЗапасов()
ПараметрыЗаполнения = ЗапасыСервер.ПараметрыЗаполненияВидовЗапасов();
ПараметрыЗаполнения.ИмяТЧВидыЗапасов = "ВидыЗапасовСписание";
ПараметрыЗаполнения.ПодбиратьВТЧТоварыПринятыеНаОтветственноеХранение.Вставить(Перечисления.ТипыЗапасов.ТоварНаХраненииСПравомПродажи, "Никогда");
ПараметрыЗаполнения.СторнируемыйДокумент = СторнируемыйДокумент;
Возврат ПараметрыЗаполнения;
КонецФункции
#КонецОбласти
#КонецОбласти
#КонецЕсли