понедельник, 7 марта 2022 г.

АналитикаУчетаНоменклатуры в УТ 11

Регистр Сведений АналитикаУчетаНоменклатуры. Модуль Менеджера

 

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Получает элемент справочника - ключ аналитики учета номенклатуры, если его нет, то он будет создан
//
// Параметры:
//    ПараметрыАналитики - ВыборкаИзРезультатаЗапроса, Структура - значения полей, по которым создается ключ:
//        * Номенклатура - СправочникСсылка.Номенклатура
//        * Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры
//        * Серия - СправочникСсылка.СерииНоменклатуры
//        * МестоХранения - СправочникСсылка
//        * Назначение - СправочникСсылка.Назначения
//        * СтатьяКалькуляции - СправочникСсылка.СтатьиКалькуляции
//
// Возвращаемое значение:
//    СправочникСсылка.КлючиАналитикиУчетаНоменклатуры
//
Функция ЗначениеКлючаАналитики(ПараметрыАналитики) Экспорт

    НаборЗаписей = ПолучитьНаборЗаписей(ПараметрыАналитики);
    
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() > 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"));
    
    // сформируем имена полей получения склада из коллекции по типам товаров
    ИмяПоляПроизвольный = ?(ЗначениеЗаполнено(ИменаПолей.Произвольный), "Коллекция." + ИменаПолей.Произвольный, "НЕОПРЕДЕЛЕНО");
    Если ИменаПолей.Свойство("Товар") Тогда
        Если ТипЗнч(ИменаПолей.Товар) = Тип("Структура") Тогда
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладТовар", ИменаПолей.Товар.ТекстПоля);
        Иначе
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладТовар", ИмяПоляМестаУчета(ИменаПолей, "Товар"));
        КонецЕсли;
    Иначе
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладТовар", ИмяПоляПроизвольный);
    КонецЕсли;
    
    Если ИменаПолей.Свойство("МногооборотнаяТара") Тогда
        Если ТипЗнч(ИменаПолей.МногооборотнаяТара) = Тип("Структура") Тогда
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладМногооборотнаяТара", ИменаПолей.МногооборотнаяТара.ТекстПоля);
        Иначе
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладМногооборотнаяТара", ИмяПоляМестаУчета(ИменаПолей, "МногооборотнаяТара"));
        КонецЕсли;
    Иначе
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладМногооборотнаяТара", ИмяПоляПроизвольный);
    КонецЕсли;
    
    Если ИменаПолей.Свойство("Услуга") Тогда
        Если ТипЗнч(ИменаПолей.Услуга) = Тип("Структура") Тогда
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладУслуга", ИменаПолей.Услуга.ТекстПоля);
        Иначе
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладУслуга", ИмяПоляМестаУчета(ИменаПолей, "Услуга"));
        КонецЕсли;
    Иначе
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладУслуга", ИмяПоляПроизвольный);
    КонецЕсли;
    
    Если ИменаПолей.Свойство("Работа") Тогда
        Если ТипЗнч(ИменаПолей.Работа) = Тип("Структура") Тогда
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладРабота", ИменаПолей.Работа.ТекстПоля);
        Иначе
            ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладРабота", ИмяПоляМестаУчета(ИменаПолей, "Работа"));
        КонецЕсли;
    Иначе
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСкладРабота", ИмяПоляПроизвольный);
    КонецЕсли;
    
    Возврат ТекстЗапроса;
КонецФункции

Функция ИмяПоляМестаУчета(ИменаПолей, КлючИмени, ИмяКоллекции = "Коллекция")
    Возврат
        ?(ЗначениеЗаполнено(ИменаПолей[КлючИмени]),
            ИмяКоллекции + "." + ИменаПолей[КлючИмени],
            "НЕОПРЕДЕЛЕНО");
КонецФункции

#КонецОбласти

#КонецОбласти

#КонецЕсли

Комментариев нет:

1С УПП , списание административных расходов на финансовый результат

 При проведение месяца, при определение финансовых результатов не формируются проводки: D 801.1  K 721.1 D 801.1  K 721.3