Задачи с собеседований на 1С-разработчика: запросы к регистрам и виртуальным таблицам, срез последних, отчёты на СКД, доработка документов и справочников, программное создание элементов управляемой формы, оптимизация медленных запросов, расчёт себестоимости по ФИФО. Каждая задача разобрана с кодом на встроенном языке.
Решение: Обработчик ПередЗаписью с валидацией
Полная реализация
Процедура ПередЗаписью(Отказ)
// Проверка обязательных реквизитов документа
ПроверитьОбязательныеРеквизиты(Отказ);
// Если уже есть ошибка, прерываем дальнейшие проверки
Если Отказ Тогда
Возврат;
КонецЕсли;
// Проверка табличной части
ПроверитьТабличнуюЧасть(Отказ);
КонецПроцедуры
Суммирование количества строк табличной части
Способ 1: Цикл (базовый, медленный)
Итого = 0;
Для Каждого Строка Из Объект.Товары Цикл
Итого = Итого + Строка.Количество;
КонецЦикла;
Сообщить("Всего: " + Итого);
Плюсы: простой, понятный Минусы: медленный для больших таблиц
Способ 2: Функция Итого (быстрый)
Итого = Объект.Товары.Итого("Количество");
Сообщить("Всего: " + Итого);
Плюсы: быстро, одна строка Минусы: только если в памяти
Способ 3: Запрос на БД (очень быстро для больших)
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(Товары.Количество) КАК ИтогоКол
|ИЗ Документ.Накладная.Товары КАК Товары
|ГДЕ Товары.Ссылка = &Документ";
Запрос.УстановитьПараметр("Документ", Объект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Итого = Результат.ИтогоКол;
КонецЕсли;
Решение: Настройка прав доступа для групп пользователей
Определение ролей в конфигураторе
1. Менеджер по продажам
2. Кладовщик
3. Бухгалтер
Реализация RLS (Row-Level Security)
Решение
Для выборки товаров с остатком больше нуля используем виртуальную таблицу 'Остатки' регистра накопления. Это самый эффективный и правильный способ в 1С:Предприятие.
Способ 1: С помощью запроса (язык 1С)
\n
Способ 2: Более компактный вариант (с учётом правильного имени ресурса)
\n
Ключевые моменты:
Виртуальная таблица 'Остатки':
Параметры в примере:
Ресурс "Количество":
Решение
Часть 1: Обработчик при создании документа
// В модуле формы документа "Накладная"
&НаСервере
Процедура ПриСоздаленииНаСервере(Отмена, СтандартнаяОбработка)
// Заполняем вид операции по умолчанию
Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход;
// Устанавливаем тип цен при выборе вида операции
УстановитьТипЦенПоВидуОперации();
КонецПроцедуры
Процедура УстановитьТипЦенПоВидуОперации()
Если Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Приход Тогда
Объект.ТипЦен = ПолучитьТипЦен("Закупочная");
ИначеЕсли Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход Тогда
Объект.ТипЦен = ПолучитьТипЦен("Продажная");
КонецЕсли;
КонецПроцедуры
Решение
Обзор задачи
Эта задача требует написания запроса для анализа продаж по контрагентам за последние 30 дней. Это типичный бизнес-запрос, который используется в аналитике и рейтингах клиентов. Задача проверяет:
Математическая логика
Нужно:
Решение 1: Через регистр накопления "Продажи"
Решение
Система ценообразования с типами цен
Рассмотрим реализацию многоуровневой системы управления ценами с автоматической подстановкой в документы.
Справочник "ТипыЦен"
Справочник ТипыЦен
Номер: строка (уникальный)
Наименование: строка
Описание: строка
ПриоритетОтбора: число (для определения цены по умолчанию)
ПометкаУдаления: булево
КонецСправочника
Стандартные типы цен:
Регистр сведений "ЦеныНоменклатуры"
Решение
Отчёт на СКД требует двух частей: источник данных (запрос) и компоновка (структура отчёта).
Часть 1: Создание СКД (компоновка данных)
// В метаданных:
// Отчёты
// - ОтчётПрибыльПоТоварам
// - Вид отчёта: Управляемый отчёт
// - Источник данных: СКД с запросом ниже
Часть 2: Запрос источника данных
Это основной запрос для СКД:
Решение
Это классическая задача на кросс-джойн дат и складов с остатками. Нужно получить остаток на каждую дату, даже если движений не было.
Способ 1: С использованием вспомогательной таблицы дат
ДатаНачала = '2024-01-01';
ДатаОкончания = '2024-01-03';
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.Текст =
"""ВЫБРАТЬ
Остатки.Дата,
Остатки.Склад,
Остатки.Номенклатура,
Остатки.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки(
@ДатаОкончания,
Дата,
Номенклатура,
Склад
) КАК Остатки
ГДЕ
Остатки.Дата >= @ДатаНачала
И Остатки.Дата <= @ДатаОкончания
ПОРЯДОКПО
Остатки.Дата,
Остатки.Склад,
Остатки.Номенклатура""";
Таблица = Запрос.Выполнить().Выгрузить();
Проблема: если в какой-то день не было движений по товару на складе, такая строка не выведется.
Решение
Обзор задачи
Это продвинутая задача на работу с периодическими регистрами сведений. СрезПоследних — это встроенная виртуальная таблица в 1С, которая упрощает получение последних значений. Но нужно понимать, как это работает под капотом — через подзапросы, группировку и определение максимальных дат. Это тест на понимание:
Математическая логика
Срез последних реализуется в несколько шагов:
Решение 1: С подзапросом через GROUP BY и MAX
Решение
Обзор задачи
Метод пузырька (Bubble Sort) — один из самых простых алгоритмов сортировки, хотя и не самый эффективный. Его название происходит от процесса: наибольшие элементы "всплывают" к концу массива за счёт повторяющихся проходов и обменов. Это классическая задача на собеседовании, которая проверяет понимание циклов, массивов и логики алгоритмов.
Математическая сложность
Реализация 1: Базовый вариант
Что произойдёт, если не установить ЭтотОбъект.Проведен = Истина
Это фундаментальный вопрос о механизме проведения документов в 1С:Предприятии. Правильное понимание этого вопроса критично для разработки документооборотной логики.
Ответы на вопросы
НЕ, движения не будут сформированы. Это главное последствие!
Если в обработчике проведения не установить ЭтотОбъект.Проведен = Истина, то:
Оптимизация запроса к регистру сведений
Это классическая задача оптимизации 1С-запросов. Исходный запрос имеет несколько проблем, которые негативно влияют на производительность. Рассмотрим их и предложим решение.
Проблемы исходного запроса
1. Обращение через точку к реквизитам справочника
Цены.Номенклатура.Наименование КАК НаименованиеТовара,
Цены.Номенклатура.Артикул КАК Артикул,
Это заставляет СУБД искать полный путь, что создаёт дополнительную нагрузку.
2. СрезПоследних() выполняется на БД
Виртуальная таблица СрезПоследних() — это дорогая операция, если её параметры не оптимальны.
3. Условие на реквизит справочника в ГДЕ
Сопоставление через .Родитель требует дополнительных операций СУБД.
Оптимизированное решение
Решение: Товарная ведомость по складам
Запрос для сбора данных
Решение
Регламентное задание для проверки отрицательных остатков
Рассмотрим архитектуру автоматической проверки остатков товаров с уведомлением через email и Telegram.
Создание регламентного задания
Конфигурация регламентного задания:
// В конфигураторе создаём:
// Объекты метаданных → Регламентные задания → ПроверкаОтрицательныхОстатков
РегламентноеЗадание ПроверкаОтрицательныхОстатков
Название: "Проверка отрицательных остатков"
Использование: "Используется"
Расписание: "Каждый день в 21:00"
ProcedureName: "МодульОбщегоНазначения.ПроверитьОтрицательныеОстатки"
КонецРегламентногоЗадания
Реализация процедуры проверки
Общий модуль МодульОбщегоНазначения:
Создание справочника Скидки для номенклатуры
Архитектура решения
Создаём справочник "Скидки" с механизмом иерархического поиска актуальной скидки для товара.
1. Структура справочника Номенклатура
// Справочник Номенклатура
// Свойства:
// Иерархический = Истина
// КоличествоУровней = 5
// Реквизиты:
// - Артикул (Строка, 50)
// - ЕдиницаИзмерения (СправочникСсылка.ЕдиницыИзмерения)
// - Цена (Число, 15, 2)
2. Справочник Скидки
// Справочник Скидки
// Реквизиты:
// - Номенклатура (СправочникСсылка.Номенклатура)
// - ПроцентСкидки (Число, 5, 2)
// - ДатаНачала (Дата)
// - ДатаОкончания (Дата)
// - ЭтоГруппа (Булево) // Истина, если скидка на группу
3. Функция получения актуальной скидки
Решение
Что происходит, если не установить ЭтотОбъект.Проведен = Истина
Если в обработчике проведения документа не установить свойство ЭтотОбъект.Проведен = Истина, то документ не будет считаться проведённым, и это имеет серьёзные последствия для работы всей учётной системы.
Ответы на вопросы
Ответ: НЕТ, движения не будут сформированы. Это критический момент. Независимо от того, сколько строк кода вы напишете в обработчике ПриПроведении() для создания движений через функции типа Движения.Регистр.Добавить(), они будут отменены, если свойство Проведен не установлено в значение Истина.
1С работает следующим образом: при проведении документа сначала выполняется код в обработчике, затем система проверяет значение свойства Проведен
2. Если Проведен = Ложь (значение по умолчанию), то все движения, созданные вручную, будут удалены
3. Регистры остаются пустыми, и учётные данные не фиксируются
Поиск ошибок в коде
Обнаруженные ошибки
&НаКлиенте // ← ОШИБКА: запрос выполняется на клиенте
Процедура ЗаполнитьТовары()
Запрос = Новый Запрос; // ← Это выполняется на клиенте
Почему это ошибка:
&НаСервере)Запрос не содержит данных из БДИсправление:
&НаСервере
Процедура ЗаполнитьТовары()
Результат = Запрос.Выполнить();
Для Каждого Строка Из Результат Цикл // ← ОШИБКА: неправильная итерация
Почему это ошибка:
Запрос.Выполнить() возвращает объект типа РезультатЗапроса.Выбрать()Выбор работающих сотрудников на дату
Решение с СРЕЗОМ ПОСЛЕДНИХ
Функция ПолучитьСотрудниковНаДату(ДатаОтчёта, Организация = Неопределено)
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| КадроваяИстория.Сотрудник,
| КадроваяИстория.Состояние
|ИЗ РегистрСведений.КадроваяИстория.СрезПоследних(&ДатаОтчёта, ) КАК КадроваяИстория
|ГДЕ КадроваяИстория.Состояние = ЗНАЧЕНИЕ(Перечисления.СостояниеСотрудника.Работает)";
Запрос.УстановитьПараметр("ДатаОтчёта", ДатаОтчёта);
Результат = Запрос.Выполнить();
Возврат Результат.Выгрузить();
КонецФункции
Объяснение:
СрезПоследних() — встроенная функция 1С, которая берёт последнюю запись по каждому сотруднику на указанную датуБолее сложный вариант с условиями
Нарастающий итог в СКД
Нарастающий итог — встроенная функция СКД, которая автоматически рассчитывает кумулятивную сумму. Это мощный инструмент для создания отчётов аналитического типа.
Основные концепции
Функция НарастающийИтог() в системе компоновки данных:
Решение 1: Вычисляемое поле в СКД (РЕКОМЕНДУЕТСЯ)
Решение: Добавление элементов на управляемую форму программно
// В модуле формы документа
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем реквизит формы
ДобавитьРеквизитФормы();
// Добавляем элемент на форму
ДобавитьЭлементНаФорму();
КонецПроцедуры
&НаСервере
Процедура ДобавитьРеквизитФормы()
// Получаем структуру новых реквизитов
МассивНовыхРеквизитов = Новый Массив;
ОписаниеРеквизита = Новый ОписаниеРеквизита;
ОписаниеРеквизита.Имя = "ДополнительноеПоле";
ОписаниеРеквизита.Тип = Новый ОписаниеТипов("Строка", , , 255);
ОписаниеРеквизита.ОсновнойРеквизит = Ложь;
ОписаниеРеквизита.ИспользованиеАтрибутов = ИспользованиеАтрибутов.Невозможно;
МассивНовыхРеквизитов.Добавить(ОписаниеРеквизита);
// Добавляем реквизиты в форму
ДобавитьРеквизиты(МассивНовыхРеквизитов);
КонецПроцедуры
Получение курса валюты на дату документа
Это стандартная задача при работе с многовалютными документами. Нужно получить курс, который был актуален на дату документа.
Решение с использованием ПЕРИОДИЧНОСТЬ
Это основной подход в 1С для работы с периодическими регистрами сведений.
&НаСервере
Процедура ПолучитьКурсыДляДокументов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РТУ.Ссылка КАК Документ,
| РТУ.Дата КАК Дата,
| РТУ.Валюта КАК Валюта,
| ЕСТЬNULL(КВ.Курс, 1) КАК Курс
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РТУ
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КВ
| ПО РТУ.Валюта = КВ.Валюта
| И КВ.Период <= РТУ.Дата
|ГДЕ
| РТУ.Проведен = Истина
|ПОРЯДОК ПО
| РТУ.Дата";
Результат = Запрос.Выполнить().Выгрузить();
КонецПроцедуры
Проблема: неправильный результат
Решение: Удаление строк из таблицы значений в цикле
Способ 1: Обход в обратном порядке (рекомендуемый)
Процедура УдалитьСтрокиСНулевымКоличеством(ТаблицаЗначений)
// Обходим таблицу от конца к началу
Для Индекс = ТаблицаЗначений.Количество() - 1 По 0 Шаг -1 Цикл
Строка = ТаблицаЗначений[Индекс];
Если Строка.Количество = 0 Тогда
ТаблицаЗначений.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Преимущества:
Способ 2: Использование НайтиСтроки()
Архитектура решения
Решение состоит из трёх компонентов:
1. Документ "РезервированиеТовара"
Структура
Документ: РезервированиеТовара
├── Реквизиты:
│ ├── Номер (Автонумерация)
│ ├── Дата
│ ├── Контрагент (Ссылка на Справочник.Контрагенты)
│ ├── Склад (Ссылка на Справочник.Склады)
│ └── Статус (Перечисление: Черновик, Активно, Отменено)
│
└── Табличная часть: Товары
├── Номенклатура
├── Количество
└── ЕдиницаИзмерения
Код модуля
Решение
Печатная форма документа с суммой прописью в 1С
В 1С:Предприятие для создания печатной формы документа используется макет печатной формы в конструкторе или программно. Рассмотрим оба подхода решения этой задачи.
Архитектура решения
1. Макет печатной формы (рекомендуется)
2. Программный способ
Встроенная функция суммы прописью
В 1С:Предприятие 8 существует встроенная функция ЧислоПрописью():
// Пример использования функции
Сумма = 12345.50;
СуммаПрописью = ЧислоПрописью(
Сумма,
"Рубль",
"Копейка",
"РЕД"
);
// Результат: Двенадцать тысяч триста сорок пять рублей 50 копеек
Структура макета печатной формы
Решение
Для вывода всех дат в интервале существует несколько подходов. Рассмотрим наиболее эффективные.
Способ 1: Цикл на встроенном языке (самый простой)
ДатаНачала = 2024-01-01;
ДатаОкончания = 2024-01-05;
ТекущаяДата = ДатаНачала;
Пока ТекущаяДата <= ДатаОкончания Цикл
Сообщить(Текущая Дата);
ТекущаяДата = ТекущаяДата + 86400; // 86400 секунд = 1 день
КонецЦикла;
Способ 2: Более универсальный вариант (через функцию БС)
Функция ПолучитьДатыИнтервала(ДатаНачала, ДатаОкончания)
МассивДат = Новый Массив();
ТекущаяДата = ДатаНачала;
Пока ТекущаяДата <= ДатаОкончания Цикл
МассивДат.Добавить(ТекущаяДата);
ТекущаяДата = ТекущаяДата + 86400;
КонецЦикла;
Возврат МассивДат;
КонецФункции
// Использование
Даты = ПолучитьДатыИнтервала(2024-01-01, 2024-01-05);
Для Каждого Дата Из Даты Цикл
Сообщить(Дата);
КонецЦикла;
Способ 3: Через запрос (самый мощный для больших интервалов)
Решение
Обзор задачи
Эта задача требует определения товаров с уникальными ценами — то есть цены, которые встречаются только один раз в таблице. Это тест на понимание:
Способ 1: С использованием GROUP BY и HAVING с COUNT
Выбрать
Товар.Ссылка,
Товар.Наименование Как Товар,
ЦенаТовара.Цена
Из
Справочник.Товар Как Товар
Внутреннее Соединение РегистрСведений.ЦенаТовара Как ЦенаТовара
На Товар.Ссылка = ЦенаТовара.Товар
Группировать По
Товар.Ссылка,
Товар.Наименование,
ЦенаТовара.Цена
Имеющие
КОЛИЧЕСТВО(*) = 1
Упорядочить По
Товар.Наименование
Описание: Группируем по товару и цене, затем отбираем только те группы, где количество совпадений = 1.
Способ 2: С подзапросом для подсчёта ценовых дубликатов
Решение
Обзор задачи
Необходимо поменять местами значения двух переменных разных типов (число и строка) без использования третьей переменной. Это классическая задача, которая демонстрирует понимание работы памяти и операций в 1С.
Способ 1: Использование операций конкатенации и разбиения строк
В 1С можно использовать строки как контейнер для хранения обоих значений:
Процедура ПоменятьМестами()
А = 1;
Б = "АБВ";
// Сохраняем оба значения в строку через разделитель
А = А + Символы.ПС + Б; // А теперь содержит "1" + перевод строки + "АБВ"
Б = Число(ВычислитьОконечное(А, "/")[0]); // Извлекаем первое значение
А = ВычислитьОконечное(А, "/")[1]; // Извлекаем второе значение
КонецПроцедуры
Способ 2: Арифметические операции (для чисел)
Если обе переменные числовые, можно применить классический метод через сумму и разность:
Решение
Основная функция
Функция ЧислоПрописью(Число, Валюта = "RUB") Экспорт
ПолныхРублей = Целое(Число);
Копейки = Окр((Число - ПолныхРублей) * 100, 0);
// Формируем текст рублей
ТекстРублей = КонвертироватьЧисловПрописное(ПолныхРублей);
// Получаем слово рубль/рубля/рублей
СловоВалюты = ПолучитьСловоВалюты(Валюта, ПолныхРублей, Истина);
ТекстРублей = ТекстРублей + " " + СловоВалюты;
// Формируем текст копеек
СловоКопеек = ПолучитьСловоВалюты(Валюта, Копейки, Ложь);
ТекстКопеек = Формат(Копейки, "ЧЗ=0; ЧДЗ=0") + " " + СловоКопеек;
Возврат ТекстРублей + " " + ТекстКопеек;
КонецФункции
Решение
Обработка загрузки начальных остатков из Excel
Рассмотрим реализацию обработки для импорта начальных остатков товаров из Excel-файла с валидацией данных.
Архитектура решения
Основные этапы:
Структура Excel-файла
Требуемая структура:
Строка 1 (заголовок): Номенклатура | Склад | Количество | Цена (опционально)
Данные:
- Товар 1 | Основной | 100 | 500
- Товар 2 | Филиал | 50 | 1000
Реализация обработки
Форма обработки (управляемая форма):
Решение: Получение списка всех открытых окон
Базовый способ
ОткрытыеОкна = ПолучитьОкна();
Для каждого Окно Из ОткрытыеОкна Цикл
Сообщить(Окно.Заголовок);
КонецЦикла;
Метод ПолучитьОкна() возвращает коллекцию всех открытых окон клиентского приложения.
Расширенный вариант
Функция ПолучитьСписокОткрытыхОкон() Экспорт
ОткрытыеОкна = ПолучитьОкна();
СписокОкон = Новый Массив;
Для каждого Окно Из ОткрытыеОкна Цикл
СтруктураОкна = Новый Структура;
СтруктураОкна.Вставить("Заголовок", Окно.Заголовок);
СтруктураОкна.Вставить("УникальныйИдентификатор", Окно.УникальныйИдентификатор);
СтруктураОкна.Вставить("Видимость", Окно.Видимость);
СписокОкон.Добавить(СтруктураОкна);
КонецЦикла;
Возврат СписокОкон;
КонецФункции
Практические примеры
Решение
Для автозаполнения документа нужно добавить кнопку на форму и обработчик в модуль формы документа.
Часть 1: Добавление кнопки на форму
В конструкторе формы документа "ПриобретениеТоваровУслуг":
// На форме в структуре элементов добавляем:
// Командная кнопка "ЗаполнитьПоПредыдущему"
// Текст: "Заполнить по предыдущему"
// Расположение: над таблицей Товары
Часть 2: Обработчик нажатия кнопки (в модуле формы)
Вычисление дней товаров на складе
Решение с использованием регистра движения товаров
Система управления оборудованием со сроками годности
Это комплексное решение для отслеживания оборудования, контроля сроков годности и эксплуатации.
1. Справочник "Оборудование"
// Реквизиты справочника
// - Наименование (строка)
// - ДатаПроизводства (дата)
// - СрокГодностиМесяцев (число)
// - ДатаВводаВЭксплуатацию (дата)
// - НормативнаяСрокЭксплуатацииМесяцев (число)
// - АМЛ - ответственное лицо (ссылка на Пользователей)
// - СтатусОборудования (перечисление: Active, Списано, ВОжидании)
Решение
Основной запрос (1С 8.3.10+)
Решение
Запрос с выбором по иерархии справочника
Рассмотрим различные подходы для выборки элементов из иерархического справочника и всех его подэлементов.
Архитектура справочника
Справочник "Номенклатура" имеет следующую структуру:
Справочник Номенклатура
Владелец: Номенклатура (самоссылка для иерархии)
Наименование: строка
Этозвуча: булево (флаг для разделения групп и элементов)
ТипНоменклатуры: перечисление (Товар, Услуга)
КонецСправочника
Способ 1: Запрос с ИЕРАРХИЕЙ (рекомендуется)
Самый эффективный способ для больших справочников:
Решение
1. Структура регистра сведений "ВерсииОбъектов"
РегистрСведений: "ВерсииОбъектов"
Период: Истина
Измерения:
- Объект (Ссылка) - УникальныйИдентификатор объекта
- НомерВерсии (Число, 10)
Ресурсы:
- ДанныеОбъекта (ХранилищеЗначения) - сохранённые данные
- Автор (Справочник.Пользователи)
- ДатаИзменения (ДатаВремя)
- Комментарий (Строка, 1000)
2. Сохранение версии при записи объекта
Решение
Часть 1: Анализ проблем в исходном запросе
// ИСХОДНЫЙ ЗАПРОС (медленный):
ВЫБРАТЬ
Товары.Номенклатура,
Товары.Номенклатура.Наименование, // ← ПРОБЛЕМА 1
СУММА(Товары.Количество) КАК Количество
ИЗ
РегистрНакопления.ОстаткиТоваров КАК Товары // ← ПРОБЛЕМА 2
ГДЕ
Товары.Период >= &НачалоПериода // ← ПРОБЛЕМА 3
И Товары.Период <= &КонецПериода
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
Проблема 1: Доступ к реквизитам справочника в SELECT
Товары.Номенклатура.Наименование требует дополнительной выборки из СправочникаПроблема 2: Чтение ВСЕХ строк регистра
РегистрНакопления.ОстаткиТоваров хранит ВСЕ движенияРешение
Резервное копирование базы данных 1С без доступа к Конфигуратору
Рассмотрим несколько способов реализации автоматического резервного копирования базы 1С:Предприятие.
Способ 1: Пакетный запуск через командную строку
Основные команды для резервного копирования:
1cv8.exe CONFIG /S"Сервер\БазаДанных" /DumpIB "путь\backup.dt" /Out "путь\log.txt" /N Администратор /P пароль
Параметры команды:
/S — строка подключения к базе (для клиент-серверной версии)/DumpIB — путь для сохранения дампа (выгрузка дескриптора ИБ)/Out — файл логирования результатов/N — имя пользователя/P — пароль пользователяПример с полным путём:
C:\Program Files\1C\8.3\bin\1cv8.exe CONFIG /S"localhost\TestBase" /DumpIB "D:\Backups\backup_2024.dt" /Out "D:\Backups\log_2024.txt" /N Администратор /P 123456
Способ 2: Batch-скрипт для автоматизации
Файл backup.bat (для ОС Windows):
@echo off
SetLocal EnableDelayedExpansion
Решение
Для реализации ФИФО нужен партионный учёт и алгоритм списания первых партий.
Часть 1: Регистр для партионного учёта
// В конфигурации создаём регистр накопления "ПартииТоваров"
// Тип: Остатки
// Измерения:
// - Номенклатура
// - Партия (новое поле для ID партии)
// Ресурсы:
// - Количество
// - Цена
// - СуммаОстатков
Часть 2: Процедура списания по ФИФО
Решение
Обзор задачи
Определение високосного года — это стандартная задача в разработке, которая часто встречается при работе с датами. В 1С это особенно важно при работе с расписаниями, начислениями и другими временными расчётами. Правила високоса имеют иерархическую структуру, которая требует корректного порядка проверок.
Математическая основа
Григорианский календарь использует следующие правила:
Порядок проверок критичен:
Реализация 1: Простой вариант
Решение: Избавиться от условного оператора
А = 1;
Б = 2 - А;
Объяснение
Исходный код:
Преобразованный код:
Б = 2 - АЕсли требуется именно такое поведение (А = 1 → Б = 1, А ≠ 1 → Б = 2):
А = 1;
Б = 1 + (Цел(А <> 1));
Альтернативные способы
Через таблицу соответствия:
Таблица = Новый Соответствие;
Таблица[1] = 1;
Таблица[2] = 2;
А = 1;
Б = Таблица[А];
Через функцию:
Функция ВычислитьБ(А)
Возврат 2 - А;
КонецФункции
А = 1;
Б = ВычислитьБ(А);
Практический совет
В реальном коде для такой логики лучше использовать явный условный оператор, так как это повышает читаемость:
А = 1;
Если А = 1 Тогда
Б = 1;
Иначе
Б = 2;
КонецЕсли;
Решение: Пересчёт цен при изменении валюты
Процедура ПриИзменении_Валюта()
// Старая валюта и новая валюта уже установлены в документе
// Пересчитываем цены в табличной части
Если НЕ ЗначениеЗаполнено(Валюта) Тогда
Возврат;
КонецЕсли;
ПересчитатьЦены();
ПересчитатьИтоги();
КонецПроцедуры
Решение
Структура справочника Номенклатура
- Наименование (Строка)
- ТипНоменклатуры (Перечисление): Изделие, Компонент, Материал
- ЕдиницаИзмерения (Справочник.ЕдиницыИзмерения)
- Цена (Число, 12,2)
- Компонент (Справочник.Номенклатура) - ссылка на компонент
- Количество (Число, 10,3) - количество компонента
- ЕдиницаИзмерения (Справочник.ЕдиницыИзмерения)
- Примечание (Строка, неполное)
Функция расчёта потребности материалов (рекурсивная)
Решение
Обзор задачи
Нужно создать обработку для выгрузки картинок номенклатуры в структурированные папки. Это практическая задача на работу с файловой системой, запросами к БД и регистрами остатков в 1С.
Решение 1: Основная процедура
Решение
Обзор задачи
Эта задача требует слияния двух отсортированных массивов в один упорядоченный результат с оптимизацией — за один цикл длиной (y+z). Это классическая задача из алгоритма Merge Sort и демонстрирует понимание двух указателей (two pointers), логики слияния и оптимизации циклов.
Особенность: входные массивы отсортированы по убыванию, а результат должен быть по возрастанию. Это требует инверсии логики сравнения.
Математическая логика
Для слияния двух отсортированных массивов:
Реализация 1: Базовый вариант с двумя указателями
Решение
Обзор задачи
Сравнение версий — это критическая операция в системе управления софтом, обновлений и совместимости. В 1С это особенно важно при работе с конфигурациями, расширениями и интеграциями. Версия имеет иерархическую структуру, где каждый номер разной значимости: major (8), minor (1), patch (4), build (2).
Структура версии
Формат x.x.x.x состоит из четырёх частей:
Сравнение идёт слева направо — первый отличающийся номер определяет результат.
Реализация 1: Базовый вариант
Решение
Обзор задачи
Задача требует определить, пересекаются ли два интервала с учётом типов границ (открытые и закрытые). Это важно для обработки числовых диапазонов в 1С, например при работе с расписанием, ценовыми диапазонами или временными окнами.
Математическая основа
Два интервала пересекаются, если:
При сравнении нужно учитывать тип границ (открытая/закрытая).
Реализация на 1С
Решение
Это задача требует два компонента: обработка для формирования CSV и регламентное задание для автозапуска.
Часть 1: Обработка (ОбработкаЭкспортЗакупок)
// Модуль объекта обработки
Процедура ФормироватьCSVЗакупок() Экспорт
// Получаем данные закупок за текущий день
Закупки = ПолучитьДанныеЗакупок();
// Формируем CSV
CSVДанные = ФормироватьCSV(Закупки);
// Сохраняем в файл
СохранитьFail(CSVДанные);
КонецПроцедуры
Решение
Ответ на вопрос
Запрос вернёт 100 записей.
Причина: каждая запись из таблицы А (10 записей) соединяется с каждой записью из таблицы В (10 записей), что даёт в результате 10 × 10 = 100 записей.
Что такое декартово произведение
Декартово произведение — это операция в теории множеств, которая создаёт все возможные пары элементов из двух множеств. В контексте SQL/1С это означает соединение таблиц без явного условия соединения (ON).
Математически: Если множество A = {a₁, a₂, ..., aₙ} и множество B = {b₁, b₂, ..., bₘ}, то A × B = {(a₁,b₁), (a₁,b₂), ..., (aₙ,bₘ)}, где |A × B| = |A| × |B| = n × m.
Демонстрирующий запрос 1: Явное декартово произведение
Выбрать
А.Ссылка Как АСсылка,
А.Наименование Как АНаименование,
В.Ссылка Как ВСсылка,
В.Наименование Как ВНаименование
Из
Справочник.ТаблицаА Как А,
Справочник.ТаблицаВ Как В
Результат: Если в А 10 записей, в В 10 записей, то результат будет 100 строк.