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