PrepBro
Профессии
PrepBro
Профессия:

Подготовка

  • Вопросы194
  • Задачи60

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Профессия:

Подготовка

  • Вопросы194
  • Задачи60

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Все 24 профессии
Android DeveloperData AnalystSystem Analyst1С DeveloperiOS DeveloperBusiness AnalystJava DeveloperData ScientistQA EngineerQA AutomationPHP BackendC/C++ BackendDevOps EngineerIT Project ManagerFrontend DeveloperNode.js BackendUnity DeveloperC# BackendProduct AnalystFlutter DeveloperPython DeveloperIT Product ManagerGo DeveloperData Engineer

© 2026 PrepBro. Все права защищены.

Telegram-бот

Задачи по 1С Developer

Задачи с собеседований на 1С-разработчика: запросы к регистрам и виртуальным таблицам, срез последних, отчёты на СКД, доработка документов и справочников, программное создание элементов управляемой формы, оптимизация медленных запросов, расчёт себестоимости по ФИФО. Каждая задача разобрана с кодом на встроенном языке.

Обработчик ПередЗаписью с проверкой поля
1.0 Junior🔥 29💬 1

Решение: Обработчик ПередЗаписью с валидацией

Полная реализация

Процедура ПередЗаписью(Отказ)
    
    // Проверка обязательных реквизитов документа
    ПроверитьОбязательныеРеквизиты(Отказ);
    
    // Если уже есть ошибка, прерываем дальнейшие проверки
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Проверка табличной части
    ПроверитьТабличнуюЧасть(Отказ);
    
КонецПроцедуры
Читать полностью ->
Суммирование количества строк табличной части
1.0 Junior🔥 27💬 1

Суммирование количества строк табличной части

Способ 1: Цикл (базовый, медленный)

Итого = 0;
Для Каждого Строка Из Объект.Товары Цикл
    Итого = Итого + Строка.Количество;
КонецЦикла;
Сообщить("Всего: " + Итого);

Плюсы: простой, понятный Минусы: медленный для больших таблиц

Способ 2: Функция Итого (быстрый)

Итого = Объект.Товары.Итого("Количество");
Сообщить("Всего: " + Итого);

Плюсы: быстро, одна строка Минусы: только если в памяти

Способ 3: Запрос на БД (очень быстро для больших)

Запрос = Новый Запрос();
Запрос.Текст = 
"ВЫБРАТЬ
|    СУММА(Товары.Количество) КАК ИтогоКол
|ИЗ Документ.Накладная.Товары КАК Товары
|ГДЕ Товары.Ссылка = &Документ";

Запрос.УстановитьПараметр("Документ", Объект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда
    Итого = Результат.ИтогоКол;
КонецЕсли;
Читать полностью ->
Настройка прав доступа для групп пользователей
2.0 Middle🔥 24💬 1

Решение: Настройка прав доступа для групп пользователей

Определение ролей в конфигураторе

1. Менеджер по продажам

  • Документ Продажа: создание, редактирование
  • Справочник Номенклатура: просмотр
  • Справочник Контрагенты: просмотр
  • Запрет на поля: Себестоимость, ЗакупочнаяЦена

2. Кладовщик

  • Документ ПриходПостав: создание, редактирование
  • Документ РасходМатериалов: создание, редактирование
  • RLS по складу
  • Запрет на просмотр цен

3. Бухгалтер

  • Регламентированный учёт: полный доступ
  • Все справочники: просмотр
  • Все документы: полный доступ

Реализация RLS (Row-Level Security)

Читать полностью ->
Запрос на выборку товаров с остатком больше нуля
1.0 Junior🔥 24💬 1

Решение

Для выборки товаров с остатком больше нуля используем виртуальную таблицу 'Остатки' регистра накопления. Это самый эффективный и правильный способ в 1С:Предприятие.

Способ 1: С помощью запроса (язык 1С)

\n

Способ 2: Более компактный вариант (с учётом правильного имени ресурса)

\n

Ключевые моменты:

Виртуальная таблица 'Остатки':

  • Автоматически считает остатки на дату-время выполнения запроса
  • Умеет использовать фильтры по измерениям для оптимизации
  • Включает все движения регистра до указанной даты
  • Синтаксис параметров:

Параметры в примере:

  • Первый параметр (дата) — пуст, значит берём текущий момент
  • Второй параметр — "Номенклатура" (периодичность — берём последнее значение за период)
  • Третий параметр — дополнительный фильтр по измерениям (здесь не используется)

Ресурс "Количество":

  • Это накопляемый ресурс регистра ОстаткиТоваров
  • Значение вычисляется как сумма всех приходов и расходов
Читать полностью ->
Доработка документа Накладная
2.3 Middle🔥 23💬 1

Решение

Часть 1: Обработчик при создании документа

// В модуле формы документа "Накладная"

&НаСервере
Процедура ПриСоздаленииНаСервере(Отмена, СтандартнаяОбработка)
    // Заполняем вид операции по умолчанию
    Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход;
    
    // Устанавливаем тип цен при выборе вида операции
    УстановитьТипЦенПоВидуОперации();
КонецПроцедуры

Процедура УстановитьТипЦенПоВидуОперации()
    Если Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Приход Тогда
        Объект.ТипЦен = ПолучитьТипЦен("Закупочная");
    ИначеЕсли Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход Тогда
        Объект.ТипЦен = ПолучитьТипЦен("Продажная");
    КонецЕсли;
КонецПроцедуры
Читать полностью ->
Запрос суммы продаж по контрагентам за 30 дней
2.0 Middle🔥 23💬 1

Решение

Обзор задачи

Эта задача требует написания запроса для анализа продаж по контрагентам за последние 30 дней. Это типичный бизнес-запрос, который используется в аналитике и рейтингах клиентов. Задача проверяет:

  • Работу с датами (вычисление "30 дней назад")
  • Группировку и суммирование (GROUP BY, SUM)
  • Работу с регистрами накопления
  • Условия фильтрации по датам

Математическая логика

Нужно:

  1. Определить дату ровно 30 дней назад
  2. Выбрать записи из регистра Продажи, где дата >= текущей даты - 30 дней
  3. Сгруппировать по контрагенту
  4. Просуммировать суммы продаж

Решение 1: Через регистр накопления "Продажи"

Читать полностью ->
Настройка ценообразования по типам цен
2.0 Middle🔥 22💬 1

Решение

Система ценообразования с типами цен

Рассмотрим реализацию многоуровневой системы управления ценами с автоматической подстановкой в документы.

Справочник "ТипыЦен"

Справочник ТипыЦен
  Номер: строка (уникальный)
  Наименование: строка
  Описание: строка
  ПриоритетОтбора: число (для определения цены по умолчанию)
  ПометкаУдаления: булево
КонецСправочника

Стандартные типы цен:

  • 01 - Закупочная
  • 02 - Оптовая
  • 03 - Розничная
  • 04 - СПО (Специальная оптовая)
  • 05 - Контрактная

Регистр сведений "ЦеныНоменклатуры"

Читать полностью ->
Отчёт по прибыли на СКД
1.7 Middle🔥 22💬 1

Решение

Отчёт на СКД требует двух частей: источник данных (запрос) и компоновка (структура отчёта).

Часть 1: Создание СКД (компоновка данных)

// В метаданных:
// Отчёты
//   - ОтчётПрибыльПоТоварам
//     - Вид отчёта: Управляемый отчёт
//     - Источник данных: СКД с запросом ниже

Часть 2: Запрос источника данных

Это основной запрос для СКД:

Читать полностью ->
Остаток товара по складам на каждый день
2.8 Senior🔥 22💬 1

Решение

Это классическая задача на кросс-джойн дат и складов с остатками. Нужно получить остаток на каждую дату, даже если движений не было.

Способ 1: С использованием вспомогательной таблицы дат

ДатаНачала = '2024-01-01';
ДатаОкончания = '2024-01-03';

Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

Запрос.Текст = 
"""ВЫБРАТЬ
    Остатки.Дата,
    Остатки.Склад,
    Остатки.Номенклатура,
    Остатки.КоличествоОстаток КАК Остаток
ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки(
        @ДатаОкончания,
        Дата,
        Номенклатура,
        Склад
    ) КАК Остатки
ГДЕ
    Остатки.Дата >= @ДатаНачала
    И Остатки.Дата <= @ДатаОкончания
ПОРЯДОКПО
    Остатки.Дата,
    Остатки.Склад,
    Остатки.Номенклатура""";

Таблица = Запрос.Выполнить().Выгрузить();

Проблема: если в какой-то день не было движений по товару на складе, такая строка не выведется.

Читать полностью ->
Срез последних без использования виртуальной таблицы
2.0 Middle🔥 22💬 1

Решение

Обзор задачи

Это продвинутая задача на работу с периодическими регистрами сведений. СрезПоследних — это встроенная виртуальная таблица в 1С, которая упрощает получение последних значений. Но нужно понимать, как это работает под капотом — через подзапросы, группировку и определение максимальных дат. Это тест на понимание:

  • Периодических регистров сведений
  • Группировки и функции MAX()
  • Корреляции между таблицами
  • Оптимизации запросов к историческим данным

Математическая логика

Срез последних реализуется в несколько шагов:

  1. Для каждого измерения (Валюта) находим максимальную дату (Период)
  2. Присоединяем исходный регистр обратно по Валюте И Периоду
  3. Получаем значения (Курс) для этих комбинаций

Решение 1: С подзапросом через GROUP BY и MAX

Читать полностью ->
Сортировка массива методом пузырька
1.0 Junior🔥 22💬 1

Решение

Обзор задачи

Метод пузырька (Bubble Sort) — один из самых простых алгоритмов сортировки, хотя и не самый эффективный. Его название происходит от процесса: наибольшие элементы "всплывают" к концу массива за счёт повторяющихся проходов и обменов. Это классическая задача на собеседовании, которая проверяет понимание циклов, массивов и логики алгоритмов.

Математическая сложность

  • Временная сложность: O(n²) в худшем и среднем случаях
  • Пространственная сложность: O(1) — сортировка на месте
  • Устойчивость: Да, относительный порядок равных элементов сохраняется
  • Лучший случай: O(n) при уже отсортированном массиве (с оптимизацией флага)

Реализация 1: Базовый вариант

Читать полностью ->
Добавление строки в табличную часть документа
1.3 Junior🔥 21💬 1

Что произойдёт, если не установить ЭтотОбъект.Проведен = Истина

Это фундаментальный вопрос о механизме проведения документов в 1С:Предприятии. Правильное понимание этого вопроса критично для разработки документооборотной логики.

Ответы на вопросы

1. Будут ли сформированы движения по регистрам?

НЕ, движения не будут сформированы. Это главное последствие!

Если в обработчике проведения не установить ЭтотОбъект.Проведен = Истина, то:

  • Программная логика в обработчике выполнится
  • Расчёты будут произведены
  • Но регистры НЕ получат движения
  • Записи в табличных части (Товары, Услуги и т.д.) останутся, но регистровые данные не обновятся
Читать полностью ->
Оптимизация запроса к регистру сведений
3.0 Senior🔥 20💬 1

Оптимизация запроса к регистру сведений

Это классическая задача оптимизации 1С-запросов. Исходный запрос имеет несколько проблем, которые негативно влияют на производительность. Рассмотрим их и предложим решение.

Проблемы исходного запроса

1. Обращение через точку к реквизитам справочника

Цены.Номенклатура.Наименование КАК НаименованиеТовара,
Цены.Номенклатура.Артикул КАК Артикул,

Это заставляет СУБД искать полный путь, что создаёт дополнительную нагрузку.

2. СрезПоследних() выполняется на БД

Виртуальная таблица СрезПоследних() — это дорогая операция, если её параметры не оптимальны.

3. Условие на реквизит справочника в ГДЕ

Сопоставление через .Родитель требует дополнительных операций СУБД.

Оптимизированное решение

Читать полностью ->
Товарная ведомость по складам
2.3 Middle🔥 20💬 1

Решение: Товарная ведомость по складам

Запрос для сбора данных

Читать полностью ->
Проверка отрицательных остатков с уведомлением
2.0 Middle🔥 19💬 1

Решение

Регламентное задание для проверки отрицательных остатков

Рассмотрим архитектуру автоматической проверки остатков товаров с уведомлением через email и Telegram.

Создание регламентного задания

Конфигурация регламентного задания:

// В конфигураторе создаём:
// Объекты метаданных → Регламентные задания → ПроверкаОтрицательныхОстатков

РегламентноеЗадание ПроверкаОтрицательныхОстатков
  Название: "Проверка отрицательных остатков"
  Использование: "Используется"
  Расписание: "Каждый день в 21:00"
  ProcedureName: "МодульОбщегоНазначения.ПроверитьОтрицательныеОстатки"
КонецРегламентногоЗадания

Реализация процедуры проверки

Общий модуль МодульОбщегоНазначения:

Читать полностью ->
Создание справочника Скидки для номенклатуры
2.3 Middle🔥 18💬 1

Создание справочника Скидки для номенклатуры

Архитектура решения

Создаём справочник "Скидки" с механизмом иерархического поиска актуальной скидки для товара.

1. Структура справочника Номенклатура

// Справочник Номенклатура
// Свойства:
//   Иерархический = Истина
//   КоличествоУровней = 5
//   Реквизиты:
//     - Артикул (Строка, 50)
//     - ЕдиницаИзмерения (СправочникСсылка.ЕдиницыИзмерения)
//     - Цена (Число, 15, 2)

2. Справочник Скидки

// Справочник Скидки
// Реквизиты:
//   - Номенклатура (СправочникСсылка.Номенклатура)
//   - ПроцентСкидки (Число, 5, 2)
//   - ДатаНачала (Дата)
//   - ДатаОкончания (Дата)
//   - ЭтоГруппа (Булево) // Истина, если скидка на группу

3. Функция получения актуальной скидки

Читать полностью ->
Что будет, если не установить ЭтотОбъект.Проведен = Истина
2.0 Middle🔥 18💬 1

Решение

Что происходит, если не установить ЭтотОбъект.Проведен = Истина

Если в обработчике проведения документа не установить свойство ЭтотОбъект.Проведен = Истина, то документ не будет считаться проведённым, и это имеет серьёзные последствия для работы всей учётной системы.

Ответы на вопросы

1. Будут ли сформированы движения по регистрам?

Ответ: НЕТ, движения не будут сформированы. Это критический момент. Независимо от того, сколько строк кода вы напишете в обработчике ПриПроведении() для создания движений через функции типа Движения.Регистр.Добавить(), они будут отменены, если свойство Проведен не установлено в значение Истина.

1С работает следующим образом: при проведении документа сначала выполняется код в обработчике, затем система проверяет значение свойства Проведен 2. Если Проведен = Ложь (значение по умолчанию), то все движения, созданные вручную, будут удалены 3. Регистры остаются пустыми, и учётные данные не фиксируются

Читать полностью ->
Поиск ошибок в коде
2.0 Middle🔥 18💬 1

Поиск ошибок в коде

Обнаруженные ошибки

Ошибка 1: Неправильный контекст выполнения запроса

&НаКлиенте  // ← ОШИБКА: запрос выполняется на клиенте
Процедура ЗаполнитьТовары()
    Запрос = Новый Запрос;  // ← Это выполняется на клиенте

Почему это ошибка:

  • Запросы в 1С выполняются только НА СЕРВЕРЕ (&НаСервере)
  • На клиенте объект Запрос не содержит данных из БД
  • Код упадёт с ошибкой: "Невозможно выполнить запрос в контексте клиента"

Исправление:

&НаСервере
Процедура ЗаполнитьТовары()

Ошибка 2: Неправильное использование результата запроса

Результат = Запрос.Выполнить();

Для Каждого Строка Из Результат Цикл  // ← ОШИБКА: неправильная итерация

Почему это ошибка:

  • Запрос.Выполнить() возвращает объект типа РезультатЗапроса
  • Итерировать через цикл Для Каждого нельзя напрямую
  • Нужно получить выборку (итератор) через .Выбрать()
Читать полностью ->
Выбор работающих сотрудников на дату
2.0 Middle🔥 18💬 1

Выбор работающих сотрудников на дату

Решение с СРЕЗОМ ПОСЛЕДНИХ

Функция ПолучитьСотрудниковНаДату(ДатаОтчёта, Организация = Неопределено)
    
    Запрос = Новый Запрос();
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    КадроваяИстория.Сотрудник,
    |    КадроваяИстория.Состояние
    |ИЗ РегистрСведений.КадроваяИстория.СрезПоследних(&ДатаОтчёта, ) КАК КадроваяИстория
    |ГДЕ КадроваяИстория.Состояние = ЗНАЧЕНИЕ(Перечисления.СостояниеСотрудника.Работает)";
    
    Запрос.УстановитьПараметр("ДатаОтчёта", ДатаОтчёта);
    
    Результат = Запрос.Выполнить();
    Возврат Результат.Выгрузить();
    
КонецФункции

Объяснение:

  • СрезПоследних() — встроенная функция 1С, которая берёт последнюю запись по каждому сотруднику на указанную дату
  • Параметры: дата, фильтры (пусто = без фильтров)
  • Фильтруем по состоянию "Работает"
  • Результат — все сотрудники, работавшие на эту дату

Более сложный вариант с условиями

Читать полностью ->
Нарастающий итог в СКД
2.2 Middle🔥 18💬 1

Нарастающий итог в СКД

Нарастающий итог — встроенная функция СКД, которая автоматически рассчитывает кумулятивную сумму. Это мощный инструмент для создания отчётов аналитического типа.

Основные концепции

Функция НарастающийИтог() в системе компоновки данных:

  • Автоматически рассчитывает текущее значение плюс сумму всех предыдущих значений
  • Работает в контексте сортировки и группировки
  • Сбрасывается при изменении группы

Решение 1: Вычисляемое поле в СКД (РЕКОМЕНДУЕТСЯ)

Читать полностью ->
Добавление элементов на управляемую форму программно
2.0 Middle🔥 18💬 1

Решение: Добавление элементов на управляемую форму программно

// В модуле формы документа

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем реквизит формы
    ДобавитьРеквизитФормы();
    
    // Добавляем элемент на форму
    ДобавитьЭлементНаФорму();
    
КонецПроцедуры

&НаСервере
Процедура ДобавитьРеквизитФормы()
    
    // Получаем структуру новых реквизитов
    МассивНовыхРеквизитов = Новый Массив;
    
    ОписаниеРеквизита = Новый ОписаниеРеквизита;
    ОписаниеРеквизита.Имя = "ДополнительноеПоле";
    ОписаниеРеквизита.Тип = Новый ОписаниеТипов("Строка", , , 255);
    ОписаниеРеквизита.ОсновнойРеквизит = Ложь;
    ОписаниеРеквизита.ИспользованиеАтрибутов = ИспользованиеАтрибутов.Невозможно;
    
    МассивНовыхРеквизитов.Добавить(ОписаниеРеквизита);
    
    // Добавляем реквизиты в форму
    ДобавитьРеквизиты(МассивНовыхРеквизитов);
    
КонецПроцедуры
Читать полностью ->
Курс валюты на дату каждого документа
2.0 Middle🔥 17💬 1

Получение курса валюты на дату документа

Это стандартная задача при работе с многовалютными документами. Нужно получить курс, который был актуален на дату документа.

Решение с использованием ПЕРИОДИЧНОСТЬ

Это основной подход в 1С для работы с периодическими регистрами сведений.

&НаСервере
Процедура ПолучитьКурсыДляДокументов()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    РТУ.Ссылка КАК Документ,
    |    РТУ.Дата КАК Дата,
    |    РТУ.Валюта КАК Валюта,
    |    ЕСТЬNULL(КВ.Курс, 1) КАК Курс
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК РТУ
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КВ
    |  ПО РТУ.Валюта = КВ.Валюта
    |  И КВ.Период <= РТУ.Дата
    |ГДЕ
    |    РТУ.Проведен = Истина
    |ПОРЯДОК ПО
    |    РТУ.Дата";
    
    Результат = Запрос.Выполнить().Выгрузить();
    
КонецПроцедуры

Проблема: неправильный результат

Читать полностью ->
Удаление строк из таблицы значений в цикле
1.2 Junior🔥 17💬 1

Решение: Удаление строк из таблицы значений в цикле

Способ 1: Обход в обратном порядке (рекомендуемый)

Процедура УдалитьСтрокиСНулевымКоличеством(ТаблицаЗначений)
    
    // Обходим таблицу от конца к началу
    Для Индекс = ТаблицаЗначений.Количество() - 1 По 0 Шаг -1 Цикл
        
        Строка = ТаблицаЗначений[Индекс];
        
        Если Строка.Количество = 0 Тогда
            ТаблицаЗначений.Удалить(Индекс);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Преимущества:

  • Простой и понятный код
  • Высокая производительность
  • При удалении строки индексы оставшихся не меняются

Способ 2: Использование НайтиСтроки()

Читать полностью ->
Резервирование товара под клиента
2.3 Middle🔥 17💬 1

Архитектура решения

Решение состоит из трёх компонентов:

  1. Документ РезервированиеТовара — фиксирует резервирование
  2. Регистр РезервыТоваров — накапливает информацию о резервах
  3. Отчёт "Наличие товаров" — показывает доступность

1. Документ "РезервированиеТовара"

Структура

Документ: РезервированиеТовара
├── Реквизиты:
│   ├── Номер (Автонумерация)
│   ├── Дата
│   ├── Контрагент (Ссылка на Справочник.Контрагенты)
│   ├── Склад (Ссылка на Справочник.Склады)
│   └── Статус (Перечисление: Черновик, Активно, Отменено)
│
└── Табличная часть: Товары
    ├── Номенклатура
    ├── Количество
    └── ЕдиницаИзмерения

Код модуля

Читать полностью ->
Печатная форма документа с суммой прописью
2.0 Middle🔥 16💬 1

Решение

Печатная форма документа с суммой прописью в 1С

В 1С:Предприятие для создания печатной формы документа используется макет печатной формы в конструкторе или программно. Рассмотрим оба подхода решения этой задачи.

Архитектура решения

1. Макет печатной формы (рекомендуется)

  • Создаётся в конструкторе в разделе Макеты документа
  • Используется встроенный язык 1С для добавления функциональности
  • Формирование суммы прописью выполняется через встроенную функцию или модуль

2. Программный способ

  • Реализация через программный интерфейс ОСП
  • Более гибкий, но требует больше кода

Встроенная функция суммы прописью

В 1С:Предприятие 8 существует встроенная функция ЧислоПрописью():

// Пример использования функции
Сумма = 12345.50;
СуммаПрописью = ЧислоПрописью(
    Сумма,
    "Рубль",
    "Копейка",
    "РЕД"
);
// Результат: Двенадцать тысяч триста сорок пять рублей 50 копеек

Структура макета печатной формы

Читать полностью ->
Вывод всех дат в заданном интервале
1.7 Middle🔥 16💬 1

Решение

Для вывода всех дат в интервале существует несколько подходов. Рассмотрим наиболее эффективные.

Способ 1: Цикл на встроенном языке (самый простой)

ДатаНачала = 2024-01-01;
ДатаОкончания = 2024-01-05;

ТекущаяДата = ДатаНачала;

Пока ТекущаяДата <= ДатаОкончания Цикл
    Сообщить(Текущая Дата);
    ТекущаяДата = ТекущаяДата + 86400; // 86400 секунд = 1 день
КонецЦикла;

Способ 2: Более универсальный вариант (через функцию БС)

Функция ПолучитьДатыИнтервала(ДатаНачала, ДатаОкончания)
    МассивДат = Новый Массив();
    ТекущаяДата = ДатаНачала;
    
    Пока ТекущаяДата <= ДатаОкончания Цикл
        МассивДат.Добавить(ТекущаяДата);
        ТекущаяДата = ТекущаяДата + 86400;
    КонецЦикла;
    
    Возврат МассивДат;
КонецФункции

// Использование
Даты = ПолучитьДатыИнтервала(2024-01-01, 2024-01-05);
Для Каждого Дата Из Даты Цикл
    Сообщить(Дата);
КонецЦикла;

Способ 3: Через запрос (самый мощный для больших интервалов)

Читать полностью ->
Запрос: товары с уникальной ценой
2.0 Middle🔥 16💬 1

Решение

Обзор задачи

Эта задача требует определения товаров с уникальными ценами — то есть цены, которые встречаются только один раз в таблице. Это тест на понимание:

  • GROUP BY и агрегирующих функций (COUNT)
  • HAVING условий
  • Различных подходов к решению одной задачи
  • Оптимизации запросов

Способ 1: С использованием GROUP BY и HAVING с COUNT

Выбрать
    Товар.Ссылка,
    Товар.Наименование Как Товар,
    ЦенаТовара.Цена
Из
    Справочник.Товар Как Товар
    Внутреннее Соединение РегистрСведений.ЦенаТовара Как ЦенаТовара
        На Товар.Ссылка = ЦенаТовара.Товар
Группировать По
    Товар.Ссылка,
    Товар.Наименование,
    ЦенаТовара.Цена
Имеющие
    КОЛИЧЕСТВО(*) = 1
Упорядочить По
    Товар.Наименование

Описание: Группируем по товару и цене, затем отбираем только те группы, где количество совпадений = 1.

Способ 2: С подзапросом для подсчёта ценовых дубликатов

Читать полностью ->
Поменять местами значения двух переменных без использования третьей
1.2 Junior🔥 16💬 1

Решение

Обзор задачи

Необходимо поменять местами значения двух переменных разных типов (число и строка) без использования третьей переменной. Это классическая задача, которая демонстрирует понимание работы памяти и операций в 1С.

Способ 1: Использование операций конкатенации и разбиения строк

В 1С можно использовать строки как контейнер для хранения обоих значений:

Процедура ПоменятьМестами()
    А = 1;
    Б = "АБВ";
    
    // Сохраняем оба значения в строку через разделитель
    А = А + Символы.ПС + Б; // А теперь содержит "1" + перевод строки + "АБВ"
    Б = Число(ВычислитьОконечное(А, "/")[0]); // Извлекаем первое значение
    А = ВычислитьОконечное(А, "/")[1]; // Извлекаем второе значение
КонецПроцедуры

Способ 2: Арифметические операции (для чисел)

Если обе переменные числовые, можно применить классический метод через сумму и разность:

Читать полностью ->
Функция преобразования числа в прописное написание
2.0 Middle🔥 15💬 1

Решение

Основная функция

Функция ЧислоПрописью(Число, Валюта = "RUB") Экспорт
    
    ПолныхРублей = Целое(Число);
    Копейки = Окр((Число - ПолныхРублей) * 100, 0);
    
    // Формируем текст рублей
    ТекстРублей = КонвертироватьЧисловПрописное(ПолныхРублей);
    
    // Получаем слово рубль/рубля/рублей
    СловоВалюты = ПолучитьСловоВалюты(Валюта, ПолныхРублей, Истина);
    ТекстРублей = ТекстРублей + " " + СловоВалюты;
    
    // Формируем текст копеек
    СловоКопеек = ПолучитьСловоВалюты(Валюта, Копейки, Ложь);
    ТекстКопеек = Формат(Копейки, "ЧЗ=0; ЧДЗ=0") + " " + СловоКопеек;
    
    Возврат ТекстРублей + " " + ТекстКопеек;
    
КонецФункции
Читать полностью ->
Обработка загрузки остатков из Excel
2.0 Middle🔥 15💬 1

Решение

Обработка загрузки начальных остатков из Excel

Рассмотрим реализацию обработки для импорта начальных остатков товаров из Excel-файла с валидацией данных.

Архитектура решения

Основные этапы:

  1. Выбор файла Excel пользователем
  2. Чтение и парсирование данных из файла
  3. Валидация (проверка существования номенклатуры и складов)
  4. Создание документа "ВводОстатков" или "ПриходТоваров"
  5. Логирование результатов загрузки

Структура Excel-файла

Требуемая структура:

Строка 1 (заголовок): Номенклатура | Склад | Количество | Цена (опционально)

Данные:
- Товар 1 | Основной | 100 | 500
- Товар 2 | Филиал | 50 | 1000

Реализация обработки

Форма обработки (управляемая форма):

Читать полностью ->
Получение списка всех открытых окон
1.0 Junior🔥 14💬 1

Решение: Получение списка всех открытых окон

Базовый способ

ОткрытыеОкна = ПолучитьОкна();
Для каждого Окно Из ОткрытыеОкна Цикл
    Сообщить(Окно.Заголовок);
КонецЦикла;

Метод ПолучитьОкна() возвращает коллекцию всех открытых окон клиентского приложения.

Расширенный вариант

Функция ПолучитьСписокОткрытыхОкон() Экспорт
    
    ОткрытыеОкна = ПолучитьОкна();
    СписокОкон = Новый Массив;
    
    Для каждого Окно Из ОткрытыеОкна Цикл
        
        СтруктураОкна = Новый Структура;
        СтруктураОкна.Вставить("Заголовок", Окно.Заголовок);
        СтруктураОкна.Вставить("УникальныйИдентификатор", Окно.УникальныйИдентификатор);
        СтруктураОкна.Вставить("Видимость", Окно.Видимость);
        
        СписокОкон.Добавить(СтруктураОкна);
        
    КонецЦикла;
    
    Возврат СписокОкон;
    
КонецФункции

Практические примеры

Читать полностью ->
Автозаполнение документа по выбранным параметрам
2.0 Middle🔥 14💬 1

Решение

Для автозаполнения документа нужно добавить кнопку на форму и обработчик в модуль формы документа.

Часть 1: Добавление кнопки на форму

В конструкторе формы документа "ПриобретениеТоваровУслуг":

// На форме в структуре элементов добавляем:
// Командная кнопка "ЗаполнитьПоПредыдущему"
// Текст: "Заполнить по предыдущему"
// Расположение: над таблицей Товары

Часть 2: Обработчик нажатия кнопки (в модуле формы)

Читать полностью ->
Вычисление количества дней товаров на складе
1.8 Middle🔥 13💬 1

Вычисление дней товаров на складе

Решение с использованием регистра движения товаров

Читать полностью ->
Управление оборудованием со сроками годности
2.0 Middle🔥 13💬 1

Система управления оборудованием со сроками годности

Это комплексное решение для отслеживания оборудования, контроля сроков годности и эксплуатации.

1. Справочник "Оборудование"

// Реквизиты справочника
// - Наименование (строка)
// - ДатаПроизводства (дата)
// - СрокГодностиМесяцев (число)
// - ДатаВводаВЭксплуатацию (дата)
// - НормативнаяСрокЭксплуатацииМесяцев (число)
// - АМЛ - ответственное лицо (ссылка на Пользователей)
// - СтатусОборудования (перечисление: Active, Списано, ВОжидании)
Читать полностью ->
Генерация ряда чисел в запросе
3.0 Senior🔥 13💬 1

Решение

Основной запрос (1С 8.3.10+)

Читать полностью ->
Запрос с выбором из справочника по иерархии
2.0 Middle🔥 13💬 1

Решение

Запрос с выбором по иерархии справочника

Рассмотрим различные подходы для выборки элементов из иерархического справочника и всех его подэлементов.

Архитектура справочника

Справочник "Номенклатура" имеет следующую структуру:

Справочник Номенклатура
  Владелец: Номенклатура (самоссылка для иерархии)
  Наименование: строка
  Этозвуча: булево (флаг для разделения групп и элементов)
  ТипНоменклатуры: перечисление (Товар, Услуга)
КонецСправочника

Способ 1: Запрос с ИЕРАРХИЕЙ (рекомендуется)

Самый эффективный способ для больших справочников:

Читать полностью ->
Реализация версионирования объектов
3.0 Senior🔥 13💬 1

Решение

1. Структура регистра сведений "ВерсииОбъектов"

РегистрСведений: "ВерсииОбъектов"
  Период: Истина

Измерения:
  - Объект (Ссылка) - УникальныйИдентификатор объекта
  - НомерВерсии (Число, 10)

Ресурсы:
  - ДанныеОбъекта (ХранилищеЗначения) - сохранённые данные
  - Автор (Справочник.Пользователи)
  - ДатаИзменения (ДатаВремя)
  - Комментарий (Строка, 1000)

2. Сохранение версии при записи объекта

Читать полностью ->
Анализ и оптимизация медленного SQL-запроса
3.0 Senior🔥 13💬 1

Решение

Часть 1: Анализ проблем в исходном запросе

// ИСХОДНЫЙ ЗАПРОС (медленный):
ВЫБРАТЬ
    Товары.Номенклатура,
    Товары.Номенклатура.Наименование,        // ← ПРОБЛЕМА 1
    СУММА(Товары.Количество) КАК Количество
ИЗ
    РегистрНакопления.ОстаткиТоваров КАК Товары // ← ПРОБЛЕМА 2
ГДЕ
    Товары.Период >= &НачалоПериода            // ← ПРОБЛЕМА 3
    И Товары.Период <= &КонецПериода
СГРУППИРОВАТЬ ПО
    Товары.Номенклатура

Проблема 1: Доступ к реквизитам справочника в SELECT

  • Товары.Номенклатура.Наименование требует дополнительной выборки из Справочника
  • Это вызывает N+1 запросов: один к регистру, потом N к справочнику
  • Очень медленно при большом количестве товаров

Проблема 2: Чтение ВСЕХ строк регистра

  • РегистрНакопления.ОстаткиТоваров хранит ВСЕ движения
  • Если товаров миллионы, это будет очень долгая выборка
  • Нужно использовать виртуальную таблицу .Остатки
Читать полностью ->
Резервное копирование базы без доступа к конфигуратору
2.7 Senior🔥 13💬 1

Решение

Резервное копирование базы данных 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
Читать полностью ->
Реализация расчёта себестоимости по ФИФО
3.0 Senior🔥 13💬 1

Решение

Для реализации ФИФО нужен партионный учёт и алгоритм списания первых партий.

Часть 1: Регистр для партионного учёта

// В конфигурации создаём регистр накопления "ПартииТоваров"
// Тип: Остатки
// Измерения:
//   - Номенклатура
//   - Партия (новое поле для ID партии)
// Ресурсы:
//   - Количество
//   - Цена
//   - СуммаОстатков

Часть 2: Процедура списания по ФИФО

Читать полностью ->
Функция определения високосного года
1.3 Junior🔥 13💬 1

Решение

Обзор задачи

Определение високосного года — это стандартная задача в разработке, которая часто встречается при работе с датами. В 1С это особенно важно при работе с расписаниями, начислениями и другими временными расчётами. Правила високоса имеют иерархическую структуру, которая требует корректного порядка проверок.

Математическая основа

Григорианский календарь использует следующие правила:

  • Базовое правило: год кратен 4 → високосный (366 дней)
  • Исключение: год кратен 100 → не високосный
  • Исключение из исключения: год кратен 400 → високосный

Порядок проверок критичен:

  1. Сначала проверяем 400 (самое специфичное правило)
  2. Затем проверяем 100
  3. Затем проверяем 4

Реализация 1: Простой вариант

Читать полностью ->
Избавиться от условного оператора Если
1.0 Junior🔥 12💬 1

Решение: Избавиться от условного оператора

А = 1;
Б = 2 - А;

Объяснение

Исходный код:

  • Если А = 1, то Б = 1
  • Иначе Б = 2

Преобразованный код:

  • Вычисляем Б = 2 - А
  • При А = 1: Б = 2 - 1 = 1
  • При А = 2: Б = 2 - 2 = 0
  • При А = 0: Б = 2 - 0 = 2

Если требуется именно такое поведение (А = 1 → Б = 1, А ≠ 1 → Б = 2):

А = 1;
Б = 1 + (Цел(А <> 1));

Альтернативные способы

Через таблицу соответствия:

Таблица = Новый Соответствие;
Таблица[1] = 1;
Таблица[2] = 2;
А = 1;
Б = Таблица[А];

Через функцию:

Функция ВычислитьБ(А)
    Возврат 2 - А;
КонецФункции

А = 1;
Б = ВычислитьБ(А);

Практический совет

В реальном коде для такой логики лучше использовать явный условный оператор, так как это повышает читаемость:

А = 1;
Если А = 1 Тогда
    Б = 1;
Иначе
    Б = 2;
КонецЕсли;
Читать полностью ->
Пересчёт цен при изменении валюты
2.0 Middle🔥 12💬 1

Решение: Пересчёт цен при изменении валюты

Процедура ПриИзменении_Валюта()
    
    // Старая валюта и новая валюта уже установлены в документе
    // Пересчитываем цены в табличной части
    
    Если НЕ ЗначениеЗаполнено(Валюта) Тогда
        Возврат;
    КонецЕсли;
    
    ПересчитатьЦены();
    ПересчитатьИтоги();
    
КонецПроцедуры
Читать полностью ->
Механизм состава изделия с вложенностью
3.0 Senior🔥 12💬 1

Решение

Структура справочника Номенклатура

Реквизиты

- Наименование (Строка)
- ТипНоменклатуры (Перечисление): Изделие, Компонент, Материал
- ЕдиницаИзмерения (Справочник.ЕдиницыИзмерения)
- Цена (Число, 12,2)

Табличная часть "Состав"

- Компонент (Справочник.Номенклатура) - ссылка на компонент
- Количество (Число, 10,3) - количество компонента
- ЕдиницаИзмерения (Справочник.ЕдиницыИзмерения)
- Примечание (Строка, неполное)

Функция расчёта потребности материалов (рекурсивная)

Читать полностью ->
Выгрузка картинок номенклатуры в каталоги
2.0 Middle🔥 12💬 1

Решение

Обзор задачи

Нужно создать обработку для выгрузки картинок номенклатуры в структурированные папки. Это практическая задача на работу с файловой системой, запросами к БД и регистрами остатков в 1С.

Решение 1: Основная процедура

Читать полностью ->
Слияние двух отсортированных массивов
2.0 Middle🔥 12💬 1

Решение

Обзор задачи

Эта задача требует слияния двух отсортированных массивов в один упорядоченный результат с оптимизацией — за один цикл длиной (y+z). Это классическая задача из алгоритма Merge Sort и демонстрирует понимание двух указателей (two pointers), логики слияния и оптимизации циклов.

Особенность: входные массивы отсортированы по убыванию, а результат должен быть по возрастанию. Это требует инверсии логики сравнения.

Математическая логика

Для слияния двух отсортированных массивов:

  1. Используем два указателя: один на конец Y, другой на конец Z
  2. На каждой итерации сравниваем текущие элементы
  3. Берём меньший элемент (так как нам нужно возрастание из убывающих)
  4. Помещаем в результирующий массив
  5. Сдвигаем соответствующий указатель

Реализация 1: Базовый вариант с двумя указателями

Читать полностью ->
Сравнение версий программы
1.6 Junior🔥 12💬 1

Решение

Обзор задачи

Сравнение версий — это критическая операция в системе управления софтом, обновлений и совместимости. В 1С это особенно важно при работе с конфигурациями, расширениями и интеграциями. Версия имеет иерархическую структуру, где каждый номер разной значимости: major (8), minor (1), patch (4), build (2).

Структура версии

Формат x.x.x.x состоит из четырёх частей:

  • x₁ — Major версия (основной выпуск)
  • x₂ — Minor версия (функциональные дополнения)
  • x₃ — Patch версия (исправления ошибок)
  • x₄ — Build номер (номер сборки)

Сравнение идёт слева направо — первый отличающийся номер определяет результат.

Реализация 1: Базовый вариант

Читать полностью ->
Функция определения пересечения двух интервалов
2.0 Middle🔥 12💬 1

Решение

Обзор задачи

Задача требует определить, пересекаются ли два интервала с учётом типов границ (открытые и закрытые). Это важно для обработки числовых диапазонов в 1С, например при работе с расписанием, ценовыми диапазонами или временными окнами.

Математическая основа

Два интервала пересекаются, если:

  • Левая граница одного интервала меньше правой границы другого
  • Правая граница одного интервала больше левой границы другого

При сравнении нужно учитывать тип границ (открытая/закрытая).

Реализация на 1С

Читать полностью ->
Формирование CSV-файла с данными закупок
2.0 Middle🔥 11💬 1

Решение

Это задача требует два компонента: обработка для формирования CSV и регламентное задание для автозапуска.

Часть 1: Обработка (ОбработкаЭкспортЗакупок)

// Модуль объекта обработки

Процедура ФормироватьCSVЗакупок() Экспорт
    // Получаем данные закупок за текущий день
    Закупки = ПолучитьДанныеЗакупок();
    
    // Формируем CSV
    CSVДанные = ФормироватьCSV(Закупки);
    
    // Сохраняем в файл
    СохранитьFail(CSVДанные);
КонецПроцедуры
Читать полностью ->
Декартово произведение таблиц в запросе
1.6 Junior🔥 11💬 1

Решение

Ответ на вопрос

Запрос вернёт 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 строк.

Читать полностью ->