Доброго дня, коллеги!
Вопрос про “Обеспечение уникальности комплектов” в рамках курса Подготовка к Аттестации 1С:Специалист по платформе 1С:Предприятие 8.3 – общие приемы и механизмы решения задач поступал неоднократно.
Связано это прежде всего с неоднозначностью решения и необходимостью учесть множество нюансов. Ниже пример решения по шагам от нашего тренера.
Вопрос
Ответ
Перефразируем условие. Для общего случая оно будет звучать так: “Одна и та же позиция номенклатуры не может быть комплектующей для разных комплектов в данный момент времени”.
Для контроля уникальности комплектующих в запросе нужно выполнить следующее:
- Из регистра сведений СоставКомплектов, используя СрезПоследних на момент документа, выбрать все действующие составляющие других комплектов (отличных от указанного в документе), т.е. выбрать значение поля ИзменениеСоставаКомплекта других комплектов. ИзменениеСоставаКомплекта – это ссылка на документ ИзменениеСоставаКомплекта, в табличной части которого хранятся данные о комплектующих для комплекта. Таким образом, мы найдем все таблицы с комплектующими для комплектов, действующих на момент документа.
- Выбрать из найденных таблиц с комплектующими других комплектов сами комплектующие (позиции номенклатуры) и сравнить их с комплектующими в табличной части “Состав” текущего документа.
- Если найдено совпадение, т.е. какая-то из комплектующих текущего документа уже имеется в действующих комплектах, значит, условие задачи нарушено и проведение документа следует отменить.
Указанную выше проверку можно выполнить и после выполнения и записи движений, чтобы специально не очищать предварительно существующие движения документа. Либо можно при получении среза последних наложить дополнительный фильтр, исключив текущий документ (ИзменениеСоставаКомплекта <> &Ссылка).
Хотя проверка выполняется для других комплектов, не исключена ситуация, когда в текущем документе, который перепроводится, причем со смещением в будущее, изменился комплект. Именно для того, чтобы в этом случае существующие движения не влияли на результат, их можно предварительно очистить, выполнить анализ после записи новых движений или же отфильтровать в выборке, исключив текущий документ.
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3.
Разве не имеется ввиду, что, например, болт какого-то вида может быть комплектующим только для одного типа стеллажей? И для этого нужно создать РС, где Измерением будет комплектующее, а ресурсом название стеллажа+ ресурс: количество
Здравствуйте.
Имеется несколько способов хранения информации о составе комплектов. Можно также использовать и способ, предложенный Вами (комплектующие (тип: Справочник.Номенклатура) хранятся как измерения регистра сведений, а комплекты (тип: Справочник.Номенклатура) и количество каждой комплектующей в комплекте (тип: число) хранятся как ресурсы регистра. При этом действительно будет обеспечиваться уникальность комплектующих среди комплектов – за счет структуры регистра сведений. Однако у этого способа есть существенный недостаток – он не позволяет получить состав комплектов на заданный момент времени, т.е. не позволяет хранить историю изменения комплектов. А это существенно, т.к. в ряде задач данные о составе комплектов используются при проведении документов (например, когда требуется собирать комплекты из комплектующих “на лету” – при оформлении расходной накладной). Напомню, что требования к экзамену предусматривают возможность перепроведения документов задним числом, при этом результат проведения измениться не должен. Если же сделать этот регистр периодическим, то он уже перестанет обеспечивать (контролировать) уникальность комплектующих, т.к. у регистра будут уже два независимых измерения: Комплектующая и Период. Поэтому предложенный Вами способ использовать можно, но только в ограниченном классе задач – там, где состав комплектов используется справочно, например, только для начального заполнении документа.
Для решения задач на комплектацию в курсе используется более универсальная схема хранения данных о составе комплектов. Используется периодический регистр сведений СоставКомплекта, его измерение Комплект (тип: Справочник.Номенклатура) содержит данные о комплекте, а состав комплекта содержится в ресурсе ИзменениеСоставаКомплекта (тип: Документ.ИзменениеСоставаКомплекта). Документ ИзменениеСоставаКомплекта содержит в шапке поле Комплект (тип: Справочник.Номенклатура), а также табличную часть СоставКомплекта, в которой определены поля Комплектующая (тип: Справочник.Номенклатура) и Количество (тип: Число). Для определения состава комплекта создается документ ИзменениеСоставаКомплекта, в котором определяется Комплект, а также его состав (набор комплектующих в табличной части СоставКомплекта). При проведении документ формирует запись в регистре сведений СоставКомплекта: значение измерения Комплект определяется из документа, значение измерения Период определяется как момент времени документа, а ресурс ИзменениеСоставаКомплекта заполняется как ссылка на документ. При этом для получения данных о составе комплекта достаточно получить срез последних регистра сведений СоставКомплекта на заданный момент времени с отбором по комплекту. Затем получить ссылку на документ ИзменениеСоставаКомплекта (из одноименного ресурса регистра). Состав комплекта будет определяться табличной частью этого документа.
В данной статье ответ на вопрос по обеспечению уникальности комплектующих приводится как раз для этой, описанной выше, схемы хранения данных о составе комплектов.