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