По следам код-ревью
Разработка - Рефакторинг и качество кода
Мы решили к ретроспективам добавить вебинары по разбору кода, обсуждения общих практик (как выяснилось, то это достаточно удачная идея). Сюда мы относим замечания и рекомендации внутри команды, внешних команд, реализации в типовых конфигурациях, глобальной сети. Ниже я привожу основные моменты и выдержки с нескольких последних наших вебинаров.
Думаю для некоторой части аудитории предлагаемый список не привнесет особых открытий, поэтому буду рад если кто-то в комментариях предложит еще какие-нибудь «замечательные» случаи и рекомендации.
Ранее (очень давно) я уже писал обзор про часто встречающиеся ситуации (Типичные ошибки, некоторые вопросы качества и эффективности работы при разработке в 1С).
1. Используйте в команде код-ревью (обзор кода).
Если еще вы не ввели практику использования код-ревью в своей команде, то обязательно реализуйте. Нам без этого было реально сложно.

Если Вы "созрели" для проведения код ревью, то дерзайте. Некоторые аргументы для нашей команды:
1. Это мощная проверка того что делает джун или новичок.
2. Позволяет отсечь ошибки
Хочу заметить, тут нет цели найти все 100% ошибок (это вопрос тестирования), нашли несколько уже здорово.
3. Человек, который знает что его будут проверять, уже пишет лучше.
У нас есть инструкция для код-ревьювера на что он обязательно должен обращать внимание и если эти пункты нарушаются, то задача идет на возврат.
4. Все мы повышаем свою квалификацию.
После многократного разбора ошибок и методик "казусов" стало значительно меньше.
5. Уменьшается эффект bus factor (эффект автобуса)
6. Позволяет выбрать наиболее лучшее решение.
Проверяющий (щие) может не согласиться с реализацией и тогда проблема эскалируется и формируется коллегиальное обсуждение.
2. Используем «Связи параметров выбора» и «Параметры выбора»
для свойств реквизитов и свойств полей формы. Это в большинстве случаев делается легко и быстро особенно при доработках типовых конфигураций.
Если не делать никакого отбора, то получим вывод всех значений и возможность выбора даже не допустимых комбинаций. В качестве примера рассмотрим ограничение выбора для ставки НДС из типовой конфигурации.

И далее в модуле выбора мы видим код по обработке данной ситуации:

Такие же примеры можно привести для выбора номенклатуры, серии и т.д. И что самое замечательное большая часть необходимого кода уже существует)
Можно поставить проверку потом при записи формы или объекта, но лучшая практика не дать возможность выбрать лишних данных.
Замечу, что подобный подход не защищает от ошибки при программном создании.
2. Следуем общему стилю кода.
Очень важно следовать общему стилю кода – это делает доработки более прозрачными и качество высоким.
2.1. Форматирование. Это легко – выделите необходимый текст и нажмите «Shift+Alt+F».
2.2. Объявления названий реквизитов, общих модулей, объектов:
В типовых конфигурациях принято использовать параметр определяющий уникальность строки документа как «Код Строки». Но вот такая доработка "слегка" рушит общий подход.

С одной стороны, с точки зрения разработчика привнесена "большая" ясность в смысл названия, однако это значительно усложняет дальнейшую работу. Теперь покажем на примере, как это может быть.
Представим, что у нас есть новый документ с таблицей «Товары» и реквизитом «Код Строки Документа» в ней и к нам на вход приходит запрос (для примера переименовывать колонку не будем, можем забыть или результат типового запроса, который не меняем). И далее мы хотим заполнить наш документ.
Не забываем, что 1С рекомендует использовать процедуру «ЗаполнитьЗначенияСвойств» - это самый оптимальный вариант заполнения данных. И вместо вот этого кода:
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(),Выборка)
КонецЦикла;
Нам придется делать так:
Пока Выборка.Следующий() Цикл
стр_н = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(стр_н,Выборка)
стр_н.КодСтрокиДокумента = Выборка.КодСтроки;
КонецЦикла;
2.3. Использование типовых подходов. Сформировать новые движения в регистр документа можно так (через конструктора):
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
...
// регистр ЗаказыКлиентов Расход
Движения.ЗаказыКлиентов.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ЗаказыКлиентов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.ЗаказКлиента = ТекСтрокаТовары.ЗаказКлиента;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Характеристика = ТекСтрокаТовары.Характеристика;
Движение.КодСтроки = ТекСтрокаТовары.КодСтроки;
Движение.Склад = ТекСтрокаТовары.Склад;
Движение.Серия = ТекСтрокаТовары.Серия;
Движение.Заказано = ТекСтрокаТовары.Количество;
Движение.КОформлению = ТекСтрокаТовары.Количество;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
...
КонецПроцедуры
Но лучше использовать типовой подход "Проведения документов" при выполнении процедуры проведения:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
...
Документы.РеализацияТоваровУслуг.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства); // тут мы инициализируем таблицы для регистров
...
ЗаказыСервер.ОтразитьЗаказыКлиентов(ДополнительныеСвойства, Движения, Отказ); // так выполняем запись
...
ПроведениеСерверУТ.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ); // тут выполняется контроль
...
КонецПроцедуры
3. Используем «запросную модель», а не «объектную модель».
К примеру, у вас стоит задача проверить наличие признака «Налогообложение НДС» заказа клиента, и так делать не хорошо:
Если ЗаказКлиента.НалогообложениеНДС=ПредопределенноеЗначение("Перечисление.ТипыНалогообложенияНДС.ПродажаНаЭкспорт") Тогда
// делаем что-то
КонецЕсли;
Первая проблема, с которой вы столкнетесь, то это снижение быстродействия, иногда существенное. А это все потому, что платформа 1С в данном случае получает весь объект целиком.
А если в документе существует реквизит с типом «Хранилище значения» и в нем хранится скан сертификата в 10 МБ?
Вторая возможная проблема, это ошибка по разграничению доступа. К примеру, кладовщик при оформлении ордеров может видеть некоторые реквизиты - ссылка, номер и др., но не должен обладать доступом к суммовым числам. Для этого Вы создали специальную роль без доступа к сумме документа и ценам - у вас тут гарантированно возникнет ошибка доступа по RLS.
Лучше делать так:
мНалогообложениеНДС = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЗаказКлиента,”НалогообложениеНДС”);
Если мНалогообложениеНДС=ПредопределенноеЗначение("Перечисление.ТипыНалогообложенияНДС.ПродажаНаЭкспорт") Тогда
// делаем что-то
КонецЕсли;
Если проверять необходимо, даже при отсутствии прав, то не забываем использовать процедуру "УстановитьПривилегированныйРежим";
Объектная модель с остатками:
…
мОтбор = новый Структура();
мОтбор.Вставить("Склад",Склад);
// получим остатки
ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(ТекущаяДата(),мОтбор,"Склад,Номенклатура","ВНаличии");
…
Так переписать код лучше:
Запрос = новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| Ост.Склад КАК Склад,
| Ост.Номенклатура КАК Номенклатура,
| Ост.ВНаличииОстаток КАК ВНаличииОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Ост";
Запрос.УстановитьПараметр("Склад",Склад);
ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
4. Используем возможности БСП.
В качестве примера рассмотрим программное задание отборов для динамических списков. (Не стоит изобретать велосипед, т.к. для большинства задач можно с успехом применять скрытые возможности БСП).
// Ищем группу
МассивГруппаИЛИ = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(Список.Отбор,,"ГруппаИЛИ");
// Добавляем если не найдена
Если МассивГруппаИЛИ.Количество()=0 Тогда
ГруппаИЛИ = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(СписокПередачВозвратов.Отбор.Элементы, "ГруппаИЛИ", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ГруппаИ1 = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(ГруппаИЛИ, "ГруппаИ1", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
ГруппаИ2 = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(ГруппаИЛИ, "ГруппаИ2", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ГруппаИ1,"Организация",ВладелецТовара,ВидСравненияКомпоновкиДанных.Равно);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ГруппаИ2," Склад", Склад,ВидСравненияКомпоновкиДанных.Равно);
КонецЕсли;
// добавим к корню отбор
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокПередачВозвратов,"Склад",Склад,ВидСравненияКомпоновкиДанных.Равно);
5. Используйте свойство «Пользовательская видимость»
для элементов формы.
5.1. При отладке. К примеру, когда вы разрабатываете новую обработку, то Вам для отладки может понадобиться увидеть различные поля и какую-то другую информацию технического характера. Пользователю они не нужны, а иногда вредны. В этом случае можно использовать небольшой фокус с пользовательской видимостью.
К примеру, создаете реквизит для себя, снимаете пользовательскую видимость как на рис. ниже.

Потом в своем сеансе включаете и и используете, а пользователь по умолчанию его не видит и скорее всего не знает о нем вообще.

5.2. Для форм выбора и списков. Обычно при создании форм конструктором форм ссылка не передается на форму и при выборе или выводе вы будете ограничены тем списком, который изначально выведен.

Соответственно, если пользователь захочет добавить на форму свои нужные ему поля, то он не сможет этого сделать. А вот если на форму добавить ссылку и снять у нее пользовательскую видимость, то мы оставляем пользователю возможность изменить состав колонок для списков.

6. Вывод первого поля табличной части документа в список.
Если вам требуется вывести в списках какое-либо поле для дополнительной информации из табличной части, к примеру, первую номенклатуру в документе «Этап производства» или первого партнера в «Задание на перевозку».
Вот так делать не стоит:
Запрос = новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| ЭтапП.Ссылка КАК Ссылка,
| ЭтапП.Номер КАК Номер,
| ЭтапП.Дата КАК Дата,
| ЭтапП.Статус КАК Статус,
| ЕСТЬNULL(ВыхИзд.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура
|ИЗ
| Документ.ЭтапПроизводства2_2 КАК ЭтапП
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭтапПроизводства2_2.ВыходныеИзделия КАК ВыхИзд
| ПО (ВыхИзд.Ссылка = ЭтапП.Ссылка)
| И (ВыхИзд.НомерСтроки = 1)";
Оптимальным вариантом будет добавить в шапку документа новый реквизит и заполнять его при записи. Благодаря такому подходу вы с высокой эффективностью решите вопросы вывода дополнительной информации без существенного снижения производительности.

Код получится для запроса следующим:
Запрос = новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| ЭтапП.Ссылка КАК Ссылка,
| ЭтапП.Номер КАК Номер,
| ЭтапП.Дата КАК Дата,
| ЭтапП.Статус КАК Статус,
| ЭтапП.НоменклатураПервойСтроки КАК Номенклатура // лучше реквизит назвать 'мм_НоменклатураПервойСтроки'
|ИЗ
| Документ.ЭтапПроизводства2_2 КАК ЭтапП";
7. Выбор и вывод дополнительных данных от полей составного типа
довольно серьезно влияет на производительность системы, особенно когда используются RLS. Чем большее количество типов, тем будет хуже вести себя система.
При решении подобной задачи удобно создать промежуточный регистр сведений (пример из типовых конфигураций - «Реестр Документов»). В этих регистрах хранится дополнительная информация «Номер документа», «Склад», «Организация», «Статус» и др. нужные информационные поля и дополнительно ссылка на документ или справочник (для связи).
В результате вместо тяжелого запроса RLS для составного типа будет использоваться только один простой.

8. Выполнение сложных вычислений в динамических списках/запросах.
Если требуется для каждого объекта в списке вывести сложно/трудоемко (или вообще не возможно запросом) вычисляемую информацию, к примеру, процент оплаты по заказам или состояние оформления документов, то выполнять эти вычисления необходимо отдельно, а не в запросе. Результат этих вычислений удобно хранить в промежуточном регистре сведений.
Примеры из типовой конфигурации - «Состояния заказов клиентов», «Состояние Отгрузки», «Состояния ЭД» и т.д.
Первоначально добавляется регистр с необходимыми полями и ссылкой на справочник или документ. Для рассматриваемого примера "механизм состояний заказов клиентов" существует регистр сведений «Состояния заказов клиентов»:

Далее при записи или проведении объекта вы добавляете процедуру для выполнения сложных вычислений в модуль объекта/ можно даже в отдельное регламентное задание (вообще будет работать монопольно, хороший пример - "расчеты с клиентами по документам").
Для документа Заказ Клиента эта процедура выглядит следующим образом (не забываем добавить в другие документы - поступления денежных средств и т.д.):
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
…
РегистрыСведений.СостоянияЗаказовКлиентов.ОтразитьСостояниеЗаказа(Ссылка, Отказ);
…
КонецПроцедуры
В результате запрос динамического списка получился простым, а состав выводимой информации "сложный":

9. Магическое число «семь плюс-минус два»
или куча переменных в параметрах функции. Пусть у вас есть процедура "СделатьЧтоТо", и Вы ее создаете заново или дорабатываете и получаете такую замечательную запись в итоге:
Процедура СделатьЧтоТо(Организация, Партнер, Контрагент, Соглашение, ДоговорКонтрагента, СуммаДокумента, НалогообложениеНДС и т.д. )
...
КонецПроцедуры
Стоп! Это перебор, необходимо остановиться и сократить количество параметров функции. Вынесите их в одну переменную с типом "Структура":
Процедура СделатьЧтоТо(Параметры) // Параметры - это структура с передаваемыми реквизитами.
Организация = Параметры.Организация;
Партнер = Параметры.Партнер;
...
КонецПроцедуры
10. Излишняя сложность
или недорефакторинг (как предложил назвать мой коллега). Это на самом деле отдельная тема для обсуждения, но приведу пример, с которым удалось столкнуться в некоторой абстракции. В данном случае хорошо дополнительно применять принцип единственности выполняемой задачи (паттерны проектирования).
Пусть у нас есть некая функция "СделатьЧтото(Параметр булево)", которая выглядит следующим образом:
Процедура СделатьЧтото(Параметр булево)
Если Параметр=Истина Тогда
// … что-то 1
// к примеру, свернем таблицу товаров
Товары.Свернуть("Номенклатура,Характеристика","Количество,КолчиествоУпаковок");
Иначе
// … что-то 2
// к примеру, скроем видимость элементов на форме
Элементы.Группа.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Вызывается в коде она в разных местах и при анализе кода без погружения в эту функцию понять что происходит будет довольно сложно (код должен читаться как хороший роман):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
…
СделатьЧтото(Ложь);
…
КонецПроцедуры
&НаСервере
Процедура ПередЗакрытиемНаСервере()
…
СделатьЧтото(Истина);
…
КонецПроцедуры
Лучше всего такой код переделать на отдельные функции:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
…
СкрытьЛишниеЭлементыНаФорме();
…
КонецПроцедуры
&НаСервере
Процедура ПередЗакрытиемНаСервере()
…
ОбработатьТаблицуТовары();
…
КонецПроцедуры
#Область ДополнительныеПроцедуры
&НаСервере
Процедура СкрытьЛишниеЭлементыНаФорме()
// к примеру, скроем видимость элементов на форме
Элементы.Группа.Видимость = Ложь;
КонецПроцедуры
&НаСервере
Процедура ОбработатьТаблицуТовары()
// к примеру, свернем таблицу товаров
Товары.Свернуть("Номенклатура,Характеристика","Количество,КолчиествоУпаковок");
КонецПроцедуры
#КонецОбласти
11. Дублирование кода.
На мой взгляд, это один из ужасных грехов в разработке. Из-за этого возникает большой технический долг и как следствие куча ошибок, особенно при выполнении доработки. Легко можем забыть где-то поправить изменения в куче дублирующихся или полу дублирующихся функций. Объем исправлений довольно большой и соответственно временные затраты на исправление.
В качестве примера рассмотрим следующую задачу: Первая часть. Вам необходимо добавить на некоторую форму реквизит типа булево с наименованием "Скрыть видимость дополнительных данных". При изменении на значение "истина" будет скрываться видимость группы "Групповая детализация". Делаем реализацию форма:

И код обработчика "при изменении":
&НаКлиенте
Процедура СкрытьВидимостьДополнительныхДанныхПриИзменении(Элемент)
Элементы.ГруппаДетализация.Видимость = НЕ СкрытьВидимостьДополнительныхДанных;
КонецПроцедуры
Вторая часть задачи: Заказчик попросил сделать реквизит "Скрыть видимость дополнительных данных" сохраняемым на форме.
Мы переключаем свойство "Автоматическое сохранение данных" в "Использовать" и теперь, при открытии формы нам нужно изменить видимость. И сразу хочется написать следующий код:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.ГруппаДетализация.Видимость = НЕ СкрытьВидимостьДополнительныхДанных;
КонецПроцедуры
Стоп. Так делать нельзя! В этот момент вы должны выделить код первой функции и нажать правую кнопку мыши и выбрать команду «рефакторинг». И вынести в отдельную процедуру. (Лениво, но сделать надо)

В итоге должно получиться так:
&НаКлиенте
Процедура СкрытьВидимостьДополнительныхДанныхПриИзменении(Элемент)
СкрытьВидимостьДополнительныхДанных();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СкрытьВидимостьДополнительныхДанных();
КонецПроцедуры
&НаКлиенте
Процедура СкрытьВидимостьДополнительныхДанных()
Элементы.ГруппаДетализация.Видимость = НЕ СкрытьВидимостьДополнительныхДанных;
КонецПроцедуры
Третья часть задачи: Добавили еще одну вкладку "Супер дополнительные данные" и ее надо также скрывать при изменении реквизита.
&НаКлиенте
Процедура СкрытьВидимостьДополнительныхДанныхПриИзменении(Элемент)
СкрытьВидимостьДополнительныхДанных();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СкрытьВидимостьДополнительныхДанных();
КонецПроцедуры
&НаКлиенте
Процедура СкрытьВидимостьДополнительныхДанных()
Элементы.ГруппаДетализация.Видимость = НЕ СкрытьВидимостьДополнительныхДанных;
Элементы.ГруппаСуперДетализация.Видимость = НЕ СкрытьВидимостьДополнительныхДанных;
КонецПроцедуры
Необходимо выработать правило на уровне ощущений, если чувствуете, что код повторяется, то надо остановиться и вынести дублирование в отдельную функцию.
Update: В статье Как завести у себя в команде код-ревью. Отвечаем на вопросы - отвечаем на организационные, технические и процессные вопросы. Статья построена в формате вопрос-ответ.
Вступайте в нашу телеграмм-группу Инфостарт
код-ревью практика программирование стиль кода
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Нейросети Рефакторинг и качество кода Запросы Разработчик 1С 8.3 Абонемент ($m)
Нейросеть написала запрос или процедуру для вашей базы 1С, и непонятно, все ли имена в нём настоящие. Обработка компилирует текст без выполнения, сверяет его с метаданными этой базы и к каждой ошибке пишет настоящее имя, например ВНаличииОстаток вместо выдуманного КоличествоОстаток. Список ошибок с подсказками одной кнопкой копируется обратно в чат с моделью.
10 стартмани
02.11.2026 364 2 nedomolkov.ivan 1
Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Одна проверка в обработчике кнопки может выглядеть достаточной, пока ту же операцию не вызовут из другого места. На примере управляемой формы разберём, почему так происходит, как разместить проверку в общей серверной функции и чем отличается удобная проверка ввода от обязательного условия выполнения операции.
29.10.2026 379 YA_777378709 0
Рефакторинг и качество кода Разработчик Бесплатно (free)
Рассказываем, почему качественный код – это не техническая прихоть, а актив, который помогает бизнесу быстрее адаптироваться к изменениям и запускать новые фичи без бесконечного преодоления техдолга. Показываем, как объяснить бизнесу ценность рефакторинга через понятные признаки: замедление разработки, неточные оценки, страх перед legacy и хрупкость системы. Разбираем, почему неправильный рефакторинг может быть дороже его отсутствия, какие анти-паттерны ломают процесс и как не превратить улучшения в бесконечную переделку ради переделки. Объясняем, как сделать рефакторинг частью культуры команды: договориться с бизнесом, научить разработчиков видеть проблемные места, закрепить правила и поддерживать улучшения на уровне тимлидов, архитекторов и всей команды.
28.10.2026 495 Pavel791 0
Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)
Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.
1 стартмани
23.10.2026 529 Ninel_S 3
Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)
Запустили Analyzer 1C 2.7.65 на промышленной конфигурации (596 модулей, 13 669 функций) и исследовали перегруженные функции (до 1887 строк), циклические зависимости и экран «Циклы» (кольцо из 64 модулей). Разобрали, почему популярные метрики (McCabe, связность) не представлены в продукте вендора, и составили пошаговый план разделения модуля. Привели проверенный платформой 8.3.27 пример до и после рефакторинга и выявили скрытую ловушку загрузки модулей с точкой в имени.
9 стартмани
19.10.2026 468 Ninel_S 2
Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.
16.10.2026 541 Konstmax13 2
Инструментарий разработчика Нейросети Рефакторинг и качество кода EDT Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Как ИИ-агент (Claude Code) работает в живом EDT-проекте 1С:Бухгалтерии КОРП 3.0: из чего собрать стенд с MCP-сервером для EDT, как ставить задачи агенту, где он ломает проект и какие проверки это ловят. Реальные случаи: рукописные метаданные, ронявшие конфигуратор; четыре дня зависшего обновления из-за порядка блоков в Rights.rights; ошибки, которые EDT пропускает, а платформа нет; сплошная сверка вместо «вроде работает». В приложении шаблон CLAUDE.md, шаблон правила, чеклист перед обновлением базы и скрипты проверки ролей и схем СКД.
15.10.2026 3499 Konstmax13 11
Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)
Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.
1 стартмани
12.10.2026 329 Ninel_S 0
мОтбор.Вставить("Склад",Склад);
// получим остатки
ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(ТекущаяДата(),мОтбор,"Склад,Номенклатура","ВНаличии");
…
Так переписать код лучше:
Запрос = новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| Ост.Склад КАК Склад,
| Ост.Номенклатура КАК Номенклатура,
| Ост.ВНаличииОстаток КАК ВНаличииОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Ост";
Запрос.УстановитьПараметр("Склад",Склад);
ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
Только вот первый работает во много раз быстрей.
Это объект типовой конфигурации ERP 2 1С.
Очень спорное решение архитектора который отвечает в 1С за подсистему производства.
Если в случае ЗаказНаПроизводство2_2 можно натянуто оправдать тем, что оставили объект ЗаказНаПроизводство в конфигурации, то "Этапов производства" не было ранее, были маршрутный листы. Мне не нравится такое решение в типовой.
1. На мой взгляд однозначно - его надо искоренять. Плюсов его наличия я не вижу.
2.Они между прочем с этим борются (по крайней мере я так предполагаю), но так как объем БСП большой и "сложный" это не быстрый процесс.
Однако, в рамках своих доработок и разработок искоренять дублирование необходимо, а для вопроса согласованности требуется использовать договоренность в рамках некоторого интерфейса (паттерн фасад). Т.е. все эти сложные блоки функционала должны иметь удобный интерфейс - хороший пример far и набор плагинов.
А так получится индусский код, когда каждая команда пишет для себя все что нужно не глядя на то накодили другие. С таким ужасом я впервые (очень давно) столкнулся еще при доработках Битрикса.
А что, простите, сложного? Можно увидеть пару аргументов за код-ревью? У нас просто код-ревью не проводится хотелось бы услышать чем становится легче.
Ревью кода помогает:
- Находить баги
- Обеспечивать читаемость и поддерживаемость кода
- Распространять знания кода на всю команду
- Быстрее входить в работу новым членам команды
- Показывать всем новые подходы к решению задач
(19)
В принципе данное утверждение не должно нуждаться аргументации, т.е. я вас не заставляю, если "созрели", тогда дерзайте. Вот что дало нам (несколько примеров):
1. Это мощная проверка того что делает джун или новичок.
2. Позволяет отсечь ошибки
3. Человек, который знает что его будут проверять, уже пишет лучше.
У нас есть инструкция для код-ревьювера на что он обязательно должен обращать внимание и если эти пункты нарушаются, то задача идет на возврат.
4. Все мы повышаем свою квалификацию.
После многократного разбора ошибок и методик "казусов" стало значительно меньше.
5. Уменьшается эффект bus factor (эффект автобуса)
6. Позволяет выбрать наиболее лучшее решение.
Проверяющий (щие) может не согласиться с реализацией и тогда проблема эскалируется и формируется коллегиальное обсуждение.
Если для вас не очевидно зачем придерживаться стандартов то никакой "комплекс аргументов" вас не убедит.
ТЗ и понимание задачи это то что надо сделать, стандарты это как надо сделать или как не надо делать и как оформить то что сделал.
Код довольно часто читают. Кто то пишет как положено по стандарту "ПолучитьКурсВалют", а кто то пишет "ПолучаемКурсыВалют", третий пишет "ПолучаюКурсыВалют", четвёртый "ЗапросКурсовВалют".
Как то в коде одного коллеги "Если Не МыНеНаСервере Тогда".
Например, неправильно:
Функция ПолучитьМассивРолейСПравомДобавления()
Функция ПолучитьСтруктуруДополнительныхНастроек()
Правильно:
Функция ИменаРолейСПравомДобавления()
Функция ДополнительныеНастройки()
Произвести уборку путём сгребания мусора под ковёр... По мне так лучше отдельные параметры оставить.
Описание:
Возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений.
Примечание:
Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы.
Раз уж мы говорим про оптимизацию быстродействия...
Читаемость кода это НЕ улучшает, сами посмотрите, по-моему, если и есть какая-то разница в скорости чтения всех трех вариантов, то такая маленькая разница в скорости чтения доступна только НИИ.
Хватит эту тему активно педалировать в угоду своему самомнению.
Остальное в плюсик. Полезные практики.
Хотя, опять же, по поводу code review. Надо не к нему стремиться, а стремиться его автоматизировать. Нет ничего хорошего тратить кучу времени на ручной отлов технического долга и ошибок.
Объект.ЭтоГрамотноНазванныйРеквизитОбъекта = ИсточникЗаполнения.НекийРеквизит;
Объект.Код = ИсточникЗаполнения.Код;Глазами теряется, что же мы присваиваем коду.
Другое дело если две и более команд с разными стандартами, то это жесть. Особенно если задачки будут мигрировать между ними.
Приведу Вам пример из личного. Один руководитель писал всю жизнь запятые при переносе параметров перед параметром. Пришлось переучиваться под его стандарт.
Потом другого члена команды сделали ответственным за правила написания кода. И вуаля, у нас новый стандарт, теперь нужно ставить запятую на строке после параметра. И это кажется, что легко переучиваться, по факту приходится весь код обходить и переставлять запятые.
Круто наверное начитавшись о коннела и прочих РУКОВОДИТЕЛЕЙ программистов внедрять всякие "корпоративные стандарты".
Не круто говорить потом про "команду", как удобно стало "команде" и удивляться, почему мало кто принимает участие в разработке стандартов, почему со скепсисом разработчики относятся к таким вещам.
И этих примеров валом.
Оставьте эти вещи хаотичному порядку. Люди сами начинают писать примерно одинаково, когда работают вместе, без требования от тимлида ставить два пробела после запятой или прочей ерунды. Как это произойдет с пробелами после и до операторов сравнения. Люди сами попросят другого программиста так делать, без Вашего вмешательства и если это действительно мешает работе, то надавят (но на самом деле даже пробелы после и до операторов сравнения может и бесят, но на читабельность не влияют).
А про запятые в переносе параметров это выглядит конкретно у нас как вкусовщина, потому что никому в команде неизвестен потаенный смысл, зачем так делать. Если Вы скажете, почему лучше делать именно, то я буду благодарен.
(52)
Я придерживаюсь другого мнения, что чем меньше правил в стандарте, тем лучше. Иначе ваш стандарт никто не запомнит и пользоваться им не будет. А Вы узнаете об этом только через год, когда случайно заглянете в чужой код.
Действительно удобно :)
Для 1С наверное не подойдет, потому что есть привычка пользоваться конструктором запроса и он такое сотрет.
Да-да, конечно же, так всегда и бывает (красненьким). Если тимлиду удается прогнуть остальную команду под свой стиль - это и будет командный стандарт. Даже если он неидеален - наличие стандарта лучше, чем его отсутствие. Трудности "переучивания" преувеличены. Нормальному разрабу не составляет никакого труда следовать навязанному стилю. А вот смешение стилей не просто бесит - оно реально отвлекает и снижает читабельность (и именно поэтому бесит).
Обычно наследуют практику "старого" тим лида или переделывают всё под стандарты нового, но это уже экстрим, а два стандарта в одном проекте это жесть.
И "грамотный" тим лид вряд ли возьмётся под своё виденье прекрасного переделывать большой проект. Это всё таки большой объём работы, затраты времени, риски, ответственность и тд.
Проще "новому" тим лиду принять стандарты старого.
Им с начало надо самоорганизовать свой стандарт, что бы от кого то что то требовать, этим как раз и должен заниматься один человек. В принципе все соглашения обсуждаемы и если можешь грамотно обосновать их изменение, то их меняют.
С соглашением они начинают это делать гораздо качественнее и быстрее.
Не хотите не используйте. Код ревью иногда выполнять не нужно, к примеру, для разовой обработки, которую никогда и никто потом использовать не будет.
У тебя в статья пока как-то слабо соответствует заголовку.
Сначала даешь определение, потом пишешь, что код-ревью проводить надо, аргументируя это лишь тем, что вам без него было сложно.
И все, дальше тема код-ревью перетекает в тему рефакторинга.
И вся остальная статья про рефакторинг.
Интереснее как такое внедрить в команде:
- кто проводит
- с какой периодичностью
- как исправляете (задачу создаете или еще как)
- как контролируете выполнение исправления (вдруг разработчик просто забил на замечание)
- как боретесь с вкусовщиной (когда у разных разработчиков разное понимание стандартов)
- всех проверяете или выборочно
А первый пункт это такой призыв)
Заголовок соответствует
Но про организационные аспекты было бы не менее интересно узнать.
На каких проектах код-ревью целесообразно применять?
Какие трудности возникают?
Как долго применяете?
Сколько времени тратится и каких специалистов?
Очень полезно было бы узнать ответы на эти вопросы (возможно в следующей публикации).
На любых где есть команда работающая над одним продуктом.
Код-ревью очень хорошо повышает уровень программистов, правда до уровня самого компетентного, но иногда есть "синергетический" эффект. Когда уровень всей команды начинает расти, если все активно включаются в процесс.
Из минусов это затраты времени на организацию процесса и на сам процесс, но все минусы перекрываются плюсами, растёт качество продукта, уровень команды, улучшается общее владение кодом, скорость и качество разработки.
К этому не плохо добавлять статические анализаторы кода и тестирование. Но вот с тестированием конечно не всё так однозначно.
Если в команде нет джунов и мидлов. Все ведущие. Любой может сделать любую задачу и сделать хорошо.
Нужно ли выполнять код-ревью?
Каждый знает стандарты и соблюдает.
Но при проведении код-ревью возникают только вопросы с расхождением в толковании стандартов. Каждый считает правильным писать так, как он привык. И этому человеку бесполезно доказывать, что ты считаешь по другому (потому что ты так привык).
Какая будет польза от организации код-ревью в таких случаях?
Если читать вот в таком порядке то ответ будет очевиден.
Для этого и нужно общее соглашение и один человек отвечающий за это и требующий соблюдения правил от других иначе "лебедь, рак и щука". Что бы не надо было никому ничего доказывать. У нас впёртых совсем не было. Был один его очень быстро уволили как не прошедшего испытательный срок.
Сделать хорошо можно двумя способами, с соблюдением соглашений и без соблюдения. "Хорошо" это когда работает. "Соглашения" это требования к оформлению и написанию кода.
(67)
Мы возможно друг друга не понимаем.
Есть несколько человек. Когда открываешь их код, то видишь, что пишут они круто. И с читаемостью полный порядок и с оптимальностью. Может есть какие-то неудобства, но ты понимаешь, что это только потому, что этот человек привык по-другому чем ты (например, префиксы временным таблицам давать другие, выравнивать/не выравнивать текст запроса после равенства и другие подобные мелочи, по другому группировать процедуры по областям).
И какой же смысл ковыряться в таком коде и выискивать косяки ?
Ведь код-ревью, это другими словами, выискивание косяков.
А если косяки встречаются редко, то какой смысл их выискивать?
Дешевле исправить их во время обнаружения или я не прав?
Не только, это ещё перенимание хороших подходов.
Тут дело не в том что все пишут круто, но по своему, тут надо что бы все писали круто и при этом одинаково.
Общее владение кодом надо повышать, если работаете над одним проектом. Что бы потом можно было без проблем передавать задачи от одного человека другому внутри команды. А не так что тут писал Петя вот он выйдет из отпуска пусть сам в своей писанине и разбирается.
Есть такая вещь как стандартизация рабочего места. Есть много магазинов в них работают замечательные продавцы, каждый из них "круто" продаёт. Но существует проблема, когда один продавец выходит в другой магазин. Он не знает где что лежит. По этому рабочие места магазинов унифицируются, документы он должен складывать в зелёную папочку которая должна лежать справа от кассы в ящике, служебные записки он должен класть в жёлтую папочку которая лежит там же. Инвентарь лежит в определённом месте, чековая лента то же в определённом и тд.
Не обязательно ревьюить весь код. Можно это делать например раз в неделю по какой то части кода, остальное отдавать на откуп статическим анализаторам кода.
Да и вообще код ревью способствует так сказать "сплачённости" коллектива. Превратите "код ревью" в небольшой пятничный "тим билдинг" и профит не заставит себя долго ждать.
Просто, у нас есть такая проблема, что один пишет полезную для других функцию или механизм, а другие про это не знают. При реализации подсистем, конечно, оповещение по почте идёт, но не будешь же рассылку делать при реализации каждой процедуры/функции?
:)
Это уже надо как то организовывать что то типа "общей библиотеки" с документацией и обязательным ознакомлением.
Это зависит от того дешевле ли их исправить во время обнаружения. Исправлять что то в базе которая работает 24*7 и у тебя в неделю одно окно на 3 часа для установки обновлений может быть очень не дёшево.
Но вообще, просмотр кода - это и трансляция хороших решений в команду. Т.е. не только ошибки разработчиков выявляются, но и их фишки могут обогатить команду опытом.
Т.е. всегда есть два потока - восходящий и нисходящий, поток ошибок и интересных решений. Код-ревью - отличный транслятор опыта в команду.
Вроде оба дядьки умные.
Но Лустин говорит про сегодняшние реалии.
Еще и в контексте применения автотестов всяких.
У Макконнелла про автотесты было что-то, не подскажите?
Непонятно, когда эти автотесты появились, до или после подсчета стоимости тестирования.
Непонятно, когда эти автотесты появились, до или после подсчета стоимости тестирования.
Автотесты сейчас почти во всех проектах есть, но их наличие позволяет найти в большинстве своем те проблемы, которые уже были когда-то обнаружены, при том не единожды. И есть у Макконнелла мнение, основанное на исследованиях разработки ПО, что тестирование получается сильно дороже экстремальной разработки с использованием парного программирования и гибких подходов, ревью кода в которых считается неотьемлемой частью процесса постоянного улучшения качества.
И если такой подход прокатывает (риски и результаты такого подхода "побоку") то можно так и оставить.
Хочешь повысить качество продукта плати деньги.
1. Занятости разработчиков в части исправления ошибок, т.к. вместо разработки они исправляют ошибки.
2. Невозможности решения предоставить функционал, т.к. в нем присутствуют ошибки.
3. Многочисленные повторные поломки.
Тестирование спасает в основном от третьего в части автотестов, т.к. повторные ошибки попадают в покрытие автотестов куда быстрее.
С точки зрения того самого М., основанной не на "я так тут подумал, т.к. пару раз встретил", а на академических исследованиях (читните тот самый "Совершенный код" - там очень много отсылок к именно академическим исследованиям и опыту больших - очень больших - компаний), обычное тестирование тестировщиком функционала решений выявляет 30% багов. Бета-тестирование на заказчике выявляет до 97% багов. Альфа-тестирование у заказчика выявляет что-то между - в районе 60% ошибок, т.к. тестовые сценарии не покрывают весь функционал. При этом ревью кода выявляет 70% ошибок и способствует росту компетенций команды, которая начинает меньше ошибаться, т.к. кейсы с ошибками обсуждаются с примером того, как сделать лучше. Те же примерно 70% дает и парное программирование, основанное на принципе, что одна голова - хорошо, а две - лучше. Т.е. на стадии программирования при парном программировании напарник уже укажет на часть ошибок, которые в итоге не попадут в релиз.
Опять же, это не мое мнение. Но оно достаточно аргументировано со стороны исследователей разработки ПО. Есть команды с другим подходом, но исследователи утверждают, что это стоит дороже.
По поводу реквизита в шапке документа, то это хорошо, если документ небольшой, и документов пока немного. Если же их вдруг пару миллионов и они сожержат в себе туеву хучу данных, то нельзя будет так просто взять и добавить новый реквизит в шапку, ибо: 1 - попадете на нереально долгую реструктуризацию, 2 - заполнять этот реквизит неделю будете. Спасает или регистр сведений (он уже есть в типовой - допсведентя или допреквизиты, но это тоже ТЧ, зато уже в отчетах можно юзать - все привязано), или "нарушение" дебильного пункта ЛС под номером 64.сколькототам.
В общем не все так радужно. Но код ревью - это бест практис, так что направление правильное.
Это реально жесть. БСП по меркам внешнего мира программирования находится в состоянии вечной альфы. "Нет обратной совместимости" - это мягко сказано.
Меня как-то дернуло использовать во внешней универсальной обработке несколько функций из базовой функциональности БСП, которые показались мне удобными, да и смысл изобретать велосипед? В итоге с выходом новых версий БСП мне пришлось несколько раз переписывать обработку, пока в итоге не плюнул и не отвязался от БСП. Ну его в задницу такие "библиотеки". БСП - это просто общий знаменатель текущей генерации типовых конфигураций. Каждую новую генерацию ее кроят как хотят. Минимизация легаси это конечно хорошо. Но не ценой же полного отсутствия обратной совместимости даже для самой невинной функциональности. Было бы круто, если бы хоть на какие-то блоки 1С давало хоть какие-то гарантии обратной совместимости и относилась к ним более бережно. Тогда на них можно было бы хоть как-то опираться.
Та же фигня. Причём иногда даже копирование не помогает - потому что или внутри скопированных функций что-нибудь тоже вызывается, что потом ломается, или результат, который они дают и который потом отправляется ещё куда-то на доработку, потом не подходит. Потому что БСП она мало того что вечная альфа, так ещё и как макароны расползается по всем частям, взять какой-то механизм как чёрный ящик оттуда невозможно. В общем между "скопировать всю БСП к себе" и "скопировать хотя бы основные нужные и периодически дорабатывать то, что опять поломалось с новой версий" пришлось выбрать второе.
Для решения сиюминутной задачи - да. Но в общем и целом это путь в никуда. Не мне вам рассказывать, что в любом труЪ-языке библиотеки - это наше всё. В том же ноде.жс любой чих уже есть в какой-то библиотеке, вплоть до библиотек из одной строки (какая-нибудь сумма чисел). Что кстати, недавно привело к катастрофе, но суть не в этом, а в том, что нужно лечить криворуких библиотекарей из 1С, а не клеймить саму библиотечность в целом. Всякие там РазложитьСтрокуВМассив, сообщитьпользователю, сравнить массивы и т.п. - всё это нужно постоянно и каждый раз это писать или даже носить свою библиотечку - так себе варианты. Не говоря уже о более сложных механизмах, вроде адресного классификатора.
Ежу понятно, что если я хочу отправить письмо или прикрепить файл, то мне проще будет поддерживать функции БСП, а если я хочу установить отбор в ДС или условное оформление, то БСП мне тут не нужна - лучше юзать свой модуль для таких вот трехстрочных функций.
Лично я так рассуждаю: если в функции не больше 10 строк, то стоит ее написать самому. Если больше, то если невозможно вообще отказаться от идеи, и в БСП есть данный функционал, то стоит использовать его.
Но если никто не планирует в обозримом будущем переехать с УТ 10 на УТ 11 или с УПП 1.3 на ЕРП 2.4, то, полагаю, проблем нет.
А иногда особо выдающиеся команды тащат что-то из УТ 11 в УТ 10, а там типовой функционал сильно завязан на БСП, и этот БСП приходится тащить с собой, а с новым БСП, который внутри переплетен сам с собой, старый функционал перестает работать, ибо модули опять же поменялись.
В общем я бы про БСП пунктик пометил как "вредный совет" )))
Там вычитал, что обратная совместимость в БСП есть. Но по определенным правилам.
И что надо в разработке использовать функции из программного интерфейса, а служебный программный не трогать.
Тогда ломаться будет реже, только при смене версии БСП. При чем не при каждой смене версии.
Я так понял, что с БСП не всё так печально, как вы описываете.
За простоту метода ЗаполнитьЗначенияСвойств приходится платить повышением рисков и усложнением рефакторинга. Просто так реквизит или поле структуры уже не переименовать, обязательно надо пройтись и вручную просмотреть все свойства всех заполняемых объектов-корреспондентов. Да и при использовании с выборками из результатов запросов надежность алгоритма резко падает, при всей внимательности... Никаких подсказок от платформы получить не удастся.
При этом ошибка во многих случаях не будет обнаружена даже в процессе исполнения кода, но последствия могут оказаться непредсказуемыми. Например "Партнер" превратился в "Клиент" и поле не заполнилось, документ провелся с неправильным ключем аналитики, разъехались взаиморасчеты, а обнаружится это где-то в конце месяца, если проверки учета вовремя делаются. Даже обход коллекции свойств и обращение к ним через [....] дают большую надежность алгоритма. Ошибка хотя бы будет выявлена при исполнении кода.
Конечно таких моментов много при разработке в 1С, но там где это возможно, хотелось бы такого избегать.
Как сравнивать введенное значение в поле: что было и что стало? Цель - узнать, был ли изменен реквизит документа.
Например:
Если Контрагент<>Ссылка.Контрагента Тогда ....
Как в таких ситуациях использовать запросную модель? Или есть другой способ?
1. А кто мешает сделать вот так:
или используя метаданные сразу построить запрос с верным набором полей.
2. Хотя обычно должен быть список отслеживаемых полей. Единственное что приходит в голову сходу - это применение данного запроса по результатам обмена, чтобы понять а были ли изменения) Данный алгоритм мы применяли и довольно успешно.
1. Я привел относительно абстрактный пример, как сравнить все поля объекта. Это можно применить в процедуре, к примеру, "перед записью" или "при записи" модуля объекта.
а) По ссылке вы получаете данные объекта хранящиеся в базе
б) У вас есть текущее измененное состояние объекта (сам объект)
с) Зная состояние в базе и текущее вы легко можете получить расхождения в обычном цикле сравнив каждый реквизит на равенство.
2. В вашем случае думаю можно использовать процедуру общего назначения (я приводил где-то выше по тексту): ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Ссылка,ИмяРеквизита)
т.е.
3. Можно воспользоваться чем-то вроде типового функционала из БСП "ЗначенияДоИзменения": ОбщегоНазначенияУТКлиентСервер.ПолучитьЗначениеДоИзменения (почитайте справку в модуле)
Почему ПриЗаписи? или что-то изменилось? Скорее всего нет, изменения фиксируются в обработчике ПередЗаписью, исправьте, пожалуйста.
ГруппаИЛИ = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(СписокПередачВозвратов.Отбор.Элементы, "ГруппаИЛИ", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ГруппаИ1 = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(ГруппаИЛИ, "ГруппаИ1", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
ГруппаИ2 = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(ГруппаИЛИ, "ГруппаИ2", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ГруппаИ1,"Организация",ВладелецТовара,ВидСравненияКомпоновкиДанных.Равно);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ГруппаИ2," Склад", Склад,ВидСравненияКомпоновкиДанных.Равно);
вот так
ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(СписокПередачВозвратов.Отбор.Элементы, "ГруппаИЛИ", ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ГруппаИЛИ,"Организация",ВладелецТовара,ВидСравненияКомпоновкиДанных.Равно);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ГруппаИЛИ," Склад", Склад,ВидСравненияКомпоновкиДанных.Равно);
Суть такая же...
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1089005
Создание 09.07.19 23:30
Обновление 17.09.19 14:58
Просмотры 24703
Загрузки 0
Рейтинг
122
Комментарии 113
Код открыт Да
Рубрики Рефакторинг и качество кода
Кому
Разработчик
,
Стажер
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)