1с создать единицу измерения программно

Обновлено: 04.07.2024

Ранее для нашей задачи мы уже разработали учетную схему, пояснили некоторые нюансы решения, а также создали все необходимые объекты конфигурации. В данном разделе завершим разработку нашей конфигурации и протестируем ее на конкретном примере.

Создание общих алгоритмов

Чтобы общая функция получения коэффициента пересчета была доступна для вызова из модулей форм документов, возможны два варианта ее размещения:

  • В модуле менеджера справочника «Единицы измерения»
  • В общем модуле.

Эти два варианта практически равноценны, можно использовать любой из них. Для общих модулей имеется больше настроек, чем для модулей менеджеров. В частности, можно использовать возможность кэширования возвращаемых значений функций. (Это означает, что при повторном вызове функции будет возвращено ранее вычисленное значение, без повторного обращения к данным). Коэффициент пересчета единиц измерения считаем условно-постоянным, он изменяется достаточно редко, поэтому использование общего модуля с установленным свойством повторного использования возвращаемых значений будет несколько более оптимальным с точки зрения производительности.

Добавим общий модуль ОбщегоНазначенияПовИсп со следующими свойствами:

  • Сервер – Истина
    (т.к. потребуется обращение к таблицам базы данных)
  • Вызов сервера – Истина
    (т.к. функции этого модуля будут вызываться из клиентских модулей – модулей форм документов)
  • Повторное использование возвращаемых значений – На время сеанса
    (Заметим, что даже если это свойство установлено в значение «На время сеанса», время сохранения ранее вычисленных значений функций не превышает 20 минут с момента последнего к ним обращения. А для нашей задачи такая задержка обновления коэффициента пересчета некритична)

Свойства общего модуля ОбщегоНазначенияПовИсп

Рисунок 1 – Свойства общего модуля ОбщегоНазначенияПовИсп

В общем модуле напишем экспортную функцию ПолучитьКоэффициент:

Обратим внимание, что всегда желательно делать проверку результата запроса на пустоту (п. 1):

перед открытием выборки (п. 2):

Дело в том, что на открытие выборки система всегда тратит некоторые ресурсы, и если запрос пуст, то эти траты окажутся напрасными.

Заметим также, почему в данном случае предпочтительнее использовать именно запрос. Казалось бы, данная функция могла быть гораздо проще:

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Я не понимаю логику :
1. Зачем заданы весовые и объемные характеристики в самом справочнике Номенклатура
2. Как Создавать единицу измерения Коробка и где она отражается в карточке номенклатуры
3. Почему справочник "УпаковкиЕдиницыИзмерения"
ссылается сам на себя - реквизиты :
ВесЕдиницаИзмерения , ВысотаЕдиницаИзмерения, ШиринаЕдиницаИзмерения, ГлубинаЕдиницаИзмерения

ниже привожу код создающий единицы измерения :

//Единицы измерения
СпрОбъект.ЕдиницаИзмерения = НайтиСоздатьЕдиницуИзмерения (СпрОбъект.Ссылка ,COMНоменклатура);
СпрОбъект.алкОсновнаяУпаковка = СпрОбъект.ЕдиницаИзмерения;

Если COMНоменклатура.ЕдиницаХраненияОстатков.Вес <> 0 Тогда
СпрОбъект.ВесИспользовать = ИСТИНА;
СпрОбъект.ВесЗнаменатель = 1;
СпрОбъект.ВесЧислитель = COMНоменклатура.ЕдиницаХраненияОстатков.Вес;
СпрОбъект.ВесЕдиницаИзмерения = СпрОбъект.ЕдиницаИзмерения;
КонецЕсли;

Если COMНоменклатура.ЕдиницаХраненияОстатков.Объем <> 0 Тогда
СпрОбъект.ОбъемИспользовать = ИСТИНА;
СпрОбъект.ОбъемЗнаменатель = 1;
СпрОбъект.ОбъемЧислитель = COMНоменклатура.ЕдиницаХраненияОстатков.Объем;
СпрОбъект.ОбъемЕдиницаИзмерения = СпрОбъект.ЕдиницаИзмерения;
Иначе
СпрОбъект.ОбъемИспользовать = ИСТИНА;
СпрОбъект.ОбъемЗнаменатель = 1;
СпрОбъект.ОбъемЧислитель = COMНоменклатура.алкЕмкость;
СпрОбъект.ОбъемЕдиницаИзмерения = СпрОбъект.ЕдиницаИзмерения;
КонецЕсли;ункция НайтиСоздатьЕдиницуИзмерения(Номенклатура , COMНоменклатура)

СпрЕд = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(C OMНоменклатура.ЕдиницаХраненияОстатков.ЕдиницаПоКл ассификатору.Код. );

Если СпрЕд.Пустая() Тогда
СпрЕд = Справочники.УпаковкиЕдиницыИзмерения.СоздатьЭлемен т();
СпрЕд.Владелец = Номенклатура;
СпрЕд.Код = COMНоменклатура.ЕдиницаХраненияОстатков.ЕдиницаПоК лассификатору.Код;
СпрЕд.Наименование = COMНоменклатура.ЕдиницаХраненияОстатков.ЕдиницаПоК лассификатору.Наименование;
Иначе
СпрЕд = СпрЕд.ПолучитьОбъект();
КонецЕсли;

СпрЕд.Наименование = COMНоменклатура.ЕдиницаХраненияОстатков.ЕдиницаПоК лассификатору.НаименованиеПолное;
СпрЕд.ТипИзмеряемойВеличины = Перечисления.ТипыИзмеряемыхВеличин.КоличествоШтук;
СпрЕд.Вес = COMНоменклатура.ЕдиницаХраненияОстатков.Вес;

Если COMНоменклатура.ЕдиницаХраненияОстатков.Объем <> 0 Тогда
СпрЕд.Объем = COMНоменклатура.ЕдиницаХраненияОстатков.Объем;
Иначе
СпрЕд.Объем = COMНоменклатура.алкЕмкость;
КонецЕсли;
СпрЕд.Записать();

Читайте также: