Глиф Учебники

Урок 7. Справочники и документы из кода

Курс «1С:Предприятие» · урок 7 из 9 · 4 минуты чтения

Всё, что пользователь делает в формах — создаёт товары, заполняет и проводит документы, — можно сделать и кодом: загрузить прайс из файла, создать документы по расписанию, исправить тысячу записей разом. В этом уроке — главные приёмы на учебной конфигурации «Склад» из урока Конфигуратор: объекты конфигурации.

Весь код работы с данными выполняется на сервере. В обработке «Практика» из прошлых уроков пишите его в процедуре с директивой &НаСервереБезКонтекста и вызывайте её из обработчика кнопки, как в уроке Процедуры, функции и модули.

Менеджеры, ссылки и объекты

Доступ к данным начинается с менеджера: Справочники.Товары, Документы.ПриходТовара. Через менеджер создают новые объекты, ищут существующие и перебирают все.

Важно различать два вида значений:

Создать элемент справочника

1С
&НаСервереБезКонтекста
Процедура СоздатьТовар()
    НовыйТовар = Справочники.Товары.СоздатьЭлемент();
    НовыйТовар.Наименование = "Карандаш";
    НовыйТовар.Цена = 1.5;
    НовыйТовар.Записать();
    Сообщить("Создан товар с кодом " + НовыйТовар.Код);
КонецПроцедуры

СоздатьЭлемент() создаёт объект только в памяти — в базе он появится после Записать(). Код программа присвоит сама при записи.

Найти и изменить

1С
&НаСервереБезКонтекста
Процедура ИзменитьЦену()
    Ссылка = Справочники.Товары.НайтиПоНаименованию("Карандаш", Истина);
    Если Ссылка.Пустая() Тогда
        Сообщить("Товар не найден");
        Возврат;
    КонецЕсли;
    ТоварОбъект = Ссылка.ПолучитьОбъект();
    ТоварОбъект.Цена = 2;
    ТоварОбъект.Записать();
    Сообщить("Новая цена: " + Ссылка.Цена);
КонецПроцедуры
Справочники.Товары менеджер НайтиПоНаименованию(…) не найдено — пустая ссылка: Ссылка.Пустая() → Истина Ссылка СправочникСсылка.Товары Ссылка.Цена читать Ссылка.Цена = 2 нельзя ПолучитьОбъект() Объект СправочникОбъект.Товары ТоварОбъект.Цена = 2 ТоварОбъект.Записать() читает записывает запись в базе «Карандаш», Цена 2
Менеджер Справочники.Товары находит ссылку на товар: через неё цену можно только прочитать, а изменить — у объекта из ПолучитьОбъект() и сохранить в базе методом Записать().

Поиск по наименованию находит первый подходящий элемент. Если названия повторяются, ищите по коду или по реквизиту запросом — об этом урок Запросы.

Перебрать все элементы

1С
&НаСервереБезКонтекста
Процедура ВсеТовары()
    Выборка = Справочники.Товары.Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.Наименование + " — " + Выборка.Цена);
    КонецЦикла;
КонецПроцедуры

Выбрать() возвращает выборку: она читает записи по одной, метод Следующий() переходит к следующей и возвращает Ложь, когда записи кончились. Отбирать и сортировать удобнее запросом — он в следующем уроке.

Пометка на удаление

1С
ТоварОбъект = Ссылка.ПолучитьОбъект();
ТоварОбъект.УстановитьПометкуУдаления(Истина);

Это то же, что Delete в списке: элемент помечается, а окончательно его удалит администратор вместе с другими помеченными. Метод Удалить() у объекта стирает запись сразу, без проверки ссылок на неё.

Удалить() не проверяет, используется ли элемент в документах. Документы останутся со ссылкой на несуществующий товар — в отчётах и формах появятся битые ссылки «<Объект не найден>». В рабочих базах используйте пометку на удаление.

Пометка на удаление УстановитьПометкуУдаления(Истина) Карандаш товар ссылка цела Приход товара Карандаш 100 удалит администратор, если ссылок нет Удаление сразу Удалить() записи нет товар ссылка битая Приход товара <Объект не найден> 100 без проверки, используется ли товар
После пометки на удаление товар остаётся в базе и ссылка из документа цела, а Удалить() стирает запись сразу, и в документе вместо товара появляется «<Объект не найден>».

Создать и провести документ

1С
&НаСервереБезКонтекста
Процедура СоздатьПриход()
    Склад = Справочники.Склады.НайтиПоНаименованию("Основной", Истина);
    Товар = Справочники.Товары.НайтиПоНаименованию("Карандаш", Истина);
    Если Склад.Пустая() ИЛИ Товар.Пустая() Тогда
        Сообщить("Нет склада «Основной» или товара «Карандаш»");
        Возврат;
    КонецЕсли;

    НовыйДокумент = Документы.ПриходТовара.СоздатьДокумент();
    НовыйДокумент.Дата = ТекущаяДата();
    НовыйДокумент.Склад = Склад;
    Строка1 = НовыйДокумент.Товары.Добавить();
    Строка1.Товар = Товар;
    Строка1.Количество = 100;
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Проведён документ № " + НовыйДокумент.Номер);
КонецПроцедуры

Проведение документа

Что делает документ при проведении, описывает процедура ОбработкаПроведения в модуле объекта документа (в дереве конфигурации щёлкните документ правой кнопкой мыши → «Открыть модуль объекта»). Конструктор движений из урока 4 написал примерно такой код:

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

Разберите по строкам:

При повторном проведении платформа сама заменяет старые движения документа новыми, а при отмене проведения — удаляет их. Если нужно запретить проведение (например, товара не хватает), в обработке проведения пишут Отказ = Истина; и сообщают пользователю причину.

Документ ПриходТовара Дата Склад Основной Товары Товар Количество Карандаш 100 Ручка 50 Движения.ОстаткиТоваров Записывать = Истина на каждую строку Товары — своя запись: Движения.ОстаткиТоваров.Добавить() у каждой записи Период = Дата ВидДвиженияТоварСкладКоличество Приход Карандаш Основной 100 Приход Ручка Основной 50 повторное проведение заменяет эти записи, отмена проведения — удаляет их
Обработка проведения на каждую строку табличной части Товары добавляет в Движения.ОстаткиТоваров запись вида Приход с тем же товаром и количеством, со складом и датой документа.

Частые ошибки

Коротко

Проверьте себя

1. Что нужно сделать, чтобы изменить цену найденного товара по ссылке?
2. Что вернёт НайтиПоНаименованию, если товара нет?
3. Где описывается, какие движения делает документ при проведении?
4. Как из кода провести документ?