Переход с платформы 1С:Предприятие 7.7 на современную версию 8.3 — это не просто обновление интерфейса, а полная смена парадигмы программирования. Многие начинающие разработчики сталкиваются с тем, что привычные методы и функции старой версии просто перестают работать в новой среде. Рассмотрим типичную ситуацию: у нас есть простая база для библиотеки, и мы хотим реализовать проведение документа ВыдачаКниги. В седьмой версии мы напрямую меняли реквизиты справочника, но в восьмерке такой подход вызовет массу проблем.
В этой статье мы разберем по шагам, почему старый код выдает ошибки и как правильно переписать логику учета под стандарты 1С 8.3, используя современные инструменты платформы.
Проанализируем исходный код, который вызвал ошибки. Основная проблема заключается в том, что в версии 8.3 объектная модель была полностью пересмотрена. Давайте выясним причину каждой ошибки:
СоздатьОбъект больше не существует. В 1С 8.3 работа со справочниками строится через менеджеры или через оператор Новый, но чаще всего для поиска данных используются запросы или методы менеджера справочника.ВыбратьСтроки() и ПолучитьСтроку() ушли в прошлое. Теперь табличные части документов — это полноценные коллекции, которые обходятся гораздо проще.Записать() является плохим тоном (антипаттерном) в 1С 8.3, так как для хранения оперативных состояний объектов (например, «Выдана книга» или «На полке») теперь используются Регистры.Посмотрим, как должен измениться цикл обхода строк. Вместо громоздкой конструкции с Пока, мы будем использовать цикл Для Каждого. Это сделает код более читаемым и защищенным от бесконечных циклов.
Рассмотрим пример правильного обхода табличной части СписокКниг документа в 1С 8.3:
Для Каждого ТекСтрока Из СписокКниг Цикл
// Здесь мы обращаемся к реквизитам строки напрямую через ТекСтрока
Сообщить("Обрабатываем книгу: " + ТекСтрока.Книга);
КонецЦикла;
В 1С 7.7 часто практиковалось изменение статуса объекта прямо в его карточке. В системе 1С 8.3 так делать крайне не рекомендуется. Почему? Потому что проведение документа — это транзакционное действие. Если вы меняете реквизит справочника (например, статус книги), вы теряете историю изменений и создаете избыточную нагрузку на базу данных при одновременной работе нескольких пользователей.
Вместо записи в Справочник.Книги, проанализируем ситуацию и создадим Регистр сведений под названием СостоянияКниг. Этот регистр будет хранить информацию о том, у кого сейчас находится книга и когда её должны вернуть. Документ при проведении будет просто делать запись в этот регистр.
Основные преимущества использования регистров в 1С 8.3:
Теперь соберем все знания воедино и напишем правильный код для модуля документа в 1С 8.3. Предположим, что у нашего документа есть табличная часть СписокКниг и реквизиты Читатель, ДатаВозврата. Мы будем записывать данные в регистр сведений СостоянияКниг.
Важно помнить: процедура ОбработкаПроведения всегда выполняется на Сервере, поэтому мы имеем прямой доступ к базе данных, но не можем вызывать окна предупреждений для пользователя.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Очищаем старые движения документа перед новым проведением
Движения.СостоянияКниг.Записывать = Истина;
Движения.СостоянияКниг.Очистить();
Для Каждого СтрТЧ Из СписокКниг Цикл
// Создаем новую запись в регистре через набор записей
Движение = Движения.СостоянияКниг.Добавить();
// Заполняем измерения и ресурсы регистра
Движение.Период = Дата; // Дата выдачи
Движение.Книга = СтрТЧ.Книга;
Движение.Читатель = Читатель;
Движение.Статус = Перечисления.СтатусыКниг.Выдана;
Движение.ДатаПлановогоВозврата = ДатаВозврата;
КонецЦикла;
// Важно: в 8.3 не нужно вызывать метод Записать() вручную для движений,
// если свойство Записывать установлено в Истина.
// Система сама зафиксирует изменения в конце транзакции.
КонецПроцедуры
Иногда возникают задачи, когда нужно изменить именно реквизит объекта. Например, если в справочнике Книги есть реквизит КоличествоВыдач, который мы хотим инкрементировать. В 1С 8.3 нельзя просто найти элемент и присвоить ему значение. Нужно сначала получить Ссылку, а из неё — Объект.
Разберем этот механизм подробнее:
Пример кода для модификации справочника (использовать с осторожностью внутри транзакции):
// СтрТЧ.Книга — это Ссылка на элемент справочника
КнигаОбъект = СтрТЧ.Книга.ПолучитьОбъект();
Если КнигаОбъект <> Неопределено Тогда
КнигаОбъект.ПоследнийЧитатель = Читатель;
КнигаОбъект.Записать();
КонецЕсли;
Важный момент: если вы создаете конфигурацию «с нуля» на управляемых формах, старайтесь избегать подобных конструкций внутри проведения. Лучше выносите логику изменения справочников в отдельные бизнес-процессы или используйте регистры накопления для количественного учета.
Проанализировав ошибки, мы видим, что переход с 7.7 на 8.3 — это отличный повод навести порядок в логике программы. Вместо того чтобы просто искать аналоги функций типа СоздатьОбъект, посмотрите на задачу шире. Используйте регистры сведений для хранения состояний и регистры накопления для учета остатков книг на полках. Это позволит вам строить сложные отчеты (например, «Список должников» или «Рейтинг самых популярных книг») буквально за несколько минут с помощью Системы Компоновки Данных (СКД), чего в 7.7 было добиться гораздо сложнее.
Помните, что в 1С 8.3 основным инструментом получения данных является Запрос. Старайтесь не перебирать справочники в циклах для поиска информации — это замедляет систему. Правильно спроектированная структура метаданных (документы -> регистры) — залог быстрой и стабильной работы вашей библиотечной системы.