Каждый раз, когда я сажусь писать код, я задаю себе один и тот же вопрос: «А не написал ли это кто-то до меня?». Есть ли уже готовая, полностью оттестированная и оптимизированная великими умами 1С процедура под мою задачу? Грубо говоря, я стараюсь никогда не изобретать велосипед, ведь в Библиотеке стандартных подсистем (БСП) всё это уже лежит на блюдечке.bБолее того, если мы откроем стандарты разработки на сайте ИТС, мы увидим прямое требование: 1С жестко предписывает использовать методы БСП вместо написания собственного кода. Это не просто рекомендация, а правило хорошего тона. В этой статье я собрала свой личный топ-лист из функций БСП, разбитый по задачам. Это те инструменты, которые нужны в разработке каждый день, чтобы писать чистый, поддерживаемый код по стандартам 1С.
Блок 1. Работа со ссылками, объектами и реквизитами
Самая частая боль — получение данных объекта без его полного считывания.
1. Точечное получение реквизитов
Проблема: Нужно получить ИНН контрагента. Обращаться в серверном коде через точку (Контрагент.ИНН) — плохая практика. Платформа неявно вытягивает всю запись объекта целиком.
Как надо по стандартам:
// Вытягивает ровно одно поле динамическим микро-запросом
ИНН = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаКонтрагента, "ИНН");
2. Получение нескольких реквизитов сразу
Если нужно несколько полей, один вызов функции вернет вам готовую структуру. Идеально для компактного кода.
Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаКонтрагента, "ИНН, КПП, НаименованиеПолное");
3. Поиск предопределенного элемента
Избавляемся от конструкций Справочники.ВидыНоменклатуры.Услуга, которые могут вызвать ошибку при обновлении или отсутствии элемента.
СсылкаНаУслугу = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыНоменклатуры.Услуга");
4. Проверка наличия реквизита у объекта
Вместо того чтобы лезть в метаданные и писать сложные обходы коллекций, используем готовое:
ЕстьСумма = ОбщегоНазначения.ЕстьРеквизитОбъекта("Сумма", МетаданныеДокумента);
// Или еще круче, для любых свойств - она проверяет, есть ли у конкретного экземпляра объекта (который может быть чем угодно: формой, структурой, строкой табличной части) реквизит, либо иное свойство с заданным именем:
ЕстьСвойство = ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДанныеОбъекта, "Комментарий");
5. Получение описания типов
Быстро генерируем описание типа для создания колонок таблиц значений или типизации реквизитов без громоздких конструкторов Новый ОписаниеТипов(...).
ОТ_Число = ОбщегоНазначения. ОписаниеТипаЧисло (15, 2);
ОТ_Строка = ОбщегоНазначения. ОписаниеТипаСтрока (100);
6. Глубокое сравнение данных
Как быстро понять, изменились ли данные, не перебирая все поля циклом?
Решение: Функция ДанныеСовпадают умеет рекурсивно сравнивать вообще всё: структуры внутри массивов, таблицы значений, примитивные типы.
Если Не ОбщегоНазначения.ДанныеСовпадают(СтарыеДанные, НовыеДанные) Тогда
// Данные различаются, запускаем логику
КонецЕсли;
7. Проверка ссылок на удаляемый объект
Перед распроведением или удалением нужно проверить ссылочную целостность, не выписывая тяжелые соединения со всеми таблицами базы.
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(СсылкаНаСклад);
Если ОбщегоНазначения.ЕстьСсылкиНаОбъект(МассивПроверки) Тогда
// Склад используется, запрещаем удаление
КонецЕсли;
Блок 2. Магия строк и форматов
8. Вставить параметры в строку (красивая обертка СтрШаблон)
ТекстШаблона = "Документ [Номер] [Дата]";
ГотовыйТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстШаблона, "123", ТекущаяДата());
Важное ограничение: как и у СтрШаблон, здесь тоже максимум 9 параметров.
Нюанс обработки: в отличие от СтрШаблон, эта функция не бросает исключение при несоответствии количества параметров. Она может вернуть строку с недозаполненными местами или пустую строку - ошибку придётся ловить отдельно.
9. Безопасное приведение строки к числу
Защищает от ошибок конвертации, очищая неразрывные пробелы и некорректные символы (частая боль при загрузке из Excel).
Сумма = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(" 15 000,50 ");
10. Парсинг строки в дату
ДатаДок = СтроковыеФункцииКлиентСервер.СтрокаВДату("31.12.2023");
11. Фамилия и Инициалы
Хватит писать велосипеды с функциями СтрНайти и Лев, чтобы получить «Иванов И. И.».
ФИО_Кратко = ФизическиеЛицаКлиентСервер.ФамилияИнициалы("Иванов Иван Иванович");
12. Склонение ФИО и должностей
Написание собственных многостраничных алгоритмов с окончаниями для склонения ФИО в печатных формах договоров — это прошлый век. В БСП для этого есть отличная готовая функция, которая возвращает структуру сразу со всеми вариантами падежей. Больше не нужно помнить числовые коды для каждого падежа — вы просто обращаетесь к понятному свойству структуры.
// Получаем структуру со всеми вариантами склонения
ПадежиДолжности = СклонениеПредставленийОбъектов.ДанныеСклонения("Генеральный директор");
// Теперь просто берем нужный падеж через точку:
Кому = ПадежиДолжности.Дательный; // Вернет: Генеральному директору
Кого = ПадежиДолжности.Родительный; // Вернет: Генерального директора
Кем = ПадежиДолжности.Творительный; // Вернет: Генеральным директором
// Аналогично работает с ФИО:
ПадежиФИО = СклонениеПредставленийОбъектов.ДанныеСклонения("Иванов Иван Иванович");
ФИО_В_Дательном = ПадежиФИО.Дательный; // Вернет: Иванову Ивану Ивановичу
Блок 3. Работа с коллекциями (Массивы, Структуры, ТЗ)
Манипуляции с коллекциями при подготовке данных для запросов — рутина, которую БСП сводит к одной строке.
13. Выгрузка колонки из ТЗ в массив (без циклов!)
Частая задача: передать колонку ТЗ как параметр в условие запроса В (&МассивДокументов).
// Третий параметр "Истина" сразу оставит только уникальные значения!
МассивНоменклатуры = ОбщегоНазначения.ВыгрузитьКолонку(ТЗ_Товары, "Номенклатура", Истина);
14. Слияние массивов
Избавляемся от цикла обхода первого массива ради добавления во второй.
// Дополняет первый массив элементами второго (с проверкой на уникальность, если Истина)
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивИтоговый, МассивНовыхДанных, Истина);
15. Свернуть массив
Удаляем дубли из любого массива одной строкой.
ОбщегоНазначенияКлиентСервер.СвернутьМассив(МассивСДублями);
16. Строка таблицы значений в Структуру
Часто нужно передать строку ТЗ в процедуру, которая принимает структуру (так как передавать саму строку ТЗ между клиентом и сервером тяжело или невозможно).
СтруктураДанных = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаТЗ);
17. Таблица значений в Массив структур
Самая частая задача при клиент-серверном взаимодействии (ведь ТЗ на клиент передавать нельзя, а массив структур — можно).
МассивСтруктурНаКлиент = ОбщегоНазначения. ТаблицаЗначенийВМассив (ТЗ);
18. Массив структур в Таблицу значений (Бонус, не БСП)
А вот обратной функции в БСП нет! Поэтому дарю вам эталонный сниппет, который должен быть в вашем шаблоне (идеально для преобразования данных с клиента обратно в серверную ТЗ):
Функция МассивСтруктурВТаблицуЗначений(МассивСтруктур) Экспорт
ТЗ = Новый ТаблицаЗначений;
Если МассивСтруктур.Количество() = 0 Тогда
Возврат ТЗ;
КонецЕсли;
Для Каждого КлючИЗначение Из МассивСтруктур[0] Цикл
ТЗ.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
Для Каждого Структура Из МассивСтруктур Цикл
НоваяСтрока = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Структура);
КонецЦикла;
Возврат ТЗ;
КонецФункции
Блок 4. Интерфейс и Взаимодействие с пользователем
19. Правильное сообщение об ошибке (По стандартам ИТС)
Проблема: Использование одиночного оператора Сообщить() прямо запрещено стандартами разработки 1С. Система должна четко позиционировать ошибку и подсказывать пользователю, в каком конкретно поле он ошибся.
Как надо: Используем универсальный метод. Платформа сама найдет поле на форме и подсветит его красным.
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Укажите корректный договор для контрагента!",
ЭтотОбъект,
"ДоговорКонтрагента", // Имя реквизита для привязки сообщения
,
Отказ);
20. Установить свойство элемента формы
Безопасная установка свойств (видимость, доступность), которая не роняет код, если элемента на форме вдруг не оказалось (например, он скрыт правами доступа).
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КнопкаПровести", "Доступность", Ложь);
21. Показать форму редактирования комментария
Вызывает стандартное красивое окно для ввода длинного многострочного текста, которое пользователи привыкли видеть в типовых конфигурациях.
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент, ТекстКомментария);
Итог:
БСП — это мощнейшая база знаний опытных разработчиков 1С, которая уже написана, отлажена и готова к использованию. Прежде чем писать сложный алгоритм обработки данных или конструировать UI-костыли, загляните в глобальные модули платформы — скорее всего, методисты 1С уже обо всем позаботились.
Использование этих функций — это не просто экономия времени. Это следование стандартам ИТС, уважение к коллегам, которые будут ревьюить ваш код, и страховка от нелепых ошибок на уровне платформы.
Пишите в комментариях, какие функции БСП вы бы добавили в этот список. Сделаем вторую часть вместе!
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.12.268
Вступайте в нашу телеграмм-группу Инфостарт