Как перевести код проведения документов из 1С 7.7 в 1С 8.3 на примере системы «Мини-библиотека»?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

Переход с платформы 1С:Предприятие 7.7 на современную версию 8.3 — это не просто обновление интерфейса, а полная смена парадигмы программирования. Многие начинающие разработчики сталкиваются с тем, что привычные методы и функции старой версии просто перестают работать в новой среде. Рассмотрим типичную ситуацию: у нас есть простая база для библиотеки, и мы хотим реализовать проведение документа ВыдачаКниги. В седьмой версии мы напрямую меняли реквизиты справочника, но в восьмерке такой подход вызовет массу проблем.

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

Разбор синтаксических ошибок: заменяем методы 7.7 на 8.3

Проанализируем исходный код, который вызвал ошибки. Основная проблема заключается в том, что в версии 8.3 объектная модель была полностью пересмотрена. Давайте выясним причину каждой ошибки:

  1. Метод СоздатьОбъект больше не существует. В 1С 8.3 работа со справочниками строится через менеджеры или через оператор Новый, но чаще всего для поиска данных используются запросы или методы менеджера справочника.
  2. Методы ВыбратьСтроки() и ПолучитьСтроку() ушли в прошлое. Теперь табличные части документов — это полноценные коллекции, которые обходятся гораздо проще.
  3. Прямая запись в справочник из модуля проведения документа Записать() является плохим тоном (антипаттерном) в 1С 8.3, так как для хранения оперативных состояний объектов (например, «Выдана книга» или «На полке») теперь используются Регистры.

Посмотрим, как должен измениться цикл обхода строк. Вместо громоздкой конструкции с Пока, мы будем использовать цикл Для Каждого. Это сделает код более читаемым и защищенным от бесконечных циклов.

Рассмотрим пример правильного обхода табличной части СписокКниг документа в 1С 8.3:


Для Каждого ТекСтрока Из СписокКниг Цикл
    // Здесь мы обращаемся к реквизитам строки напрямую через ТекСтрока
    Сообщить("Обрабатываем книгу: " + ТекСтрока.Книга);
КонецЦикла;

Архитектурный сдвиг: Справочники vs Регистры

В 1С 7.7 часто практиковалось изменение статуса объекта прямо в его карточке. В системе 1С 8.3 так делать крайне не рекомендуется. Почему? Потому что проведение документа — это транзакционное действие. Если вы меняете реквизит справочника (например, статус книги), вы теряете историю изменений и создаете избыточную нагрузку на базу данных при одновременной работе нескольких пользователей.

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

Основные преимущества использования регистров в 1С 8.3:

Реализация процедуры ОбработкаПроведения

Теперь соберем все знания воедино и напишем правильный код для модуля документа в 1С 8.3. Предположим, что у нашего документа есть табличная часть СписокКниг и реквизиты Читатель, ДатаВозврата. Мы будем записывать данные в регистр сведений СостоянияКниг.

Важно помнить: процедура ОбработкаПроведения всегда выполняется на Сервере, поэтому мы имеем прямой доступ к базе данных, но не можем вызывать окна предупреждений для пользователя.


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	// Очищаем старые движения документа перед новым проведением
	Движения.СостоянияКниг.Записывать = Истина;
	Движения.СостоянияКниг.Очистить();
	
	Для Каждого СтрТЧ Из СписокКниг Цикл
		
		// Создаем новую запись в регистре через набор записей
		Движение = Движения.СостоянияКниг.Добавить();
		
		// Заполняем измерения и ресурсы регистра
		Движение.Период = Дата; // Дата выдачи
		Движение.Книга = СтрТЧ.Книга;
		Движение.Читатель = Читатель;
		Движение.Статус = Перечисления.СтатусыКниг.Выдана;
		Движение.ДатаПлановогоВозврата = ДатаВозврата;
		
	КонецЦикла;
	
	// Важно: в 8.3 не нужно вызывать метод Записать() вручную для движений, 
	// если свойство Записывать установлено в Истина. 
	// Система сама зафиксирует изменения в конце транзакции.
	
КонецПроцедуры

Как изменить данные справочника, если это всё же необходимо?

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

Разберем этот механизм подробнее:

  1. Ссылка (Ref) — это просто идентификатор в базе данных. Она доступна для чтения, но её нельзя изменить.
  2. Объект (Object) — это копия данных в памяти сервера, которую можно редактировать.

Пример кода для модификации справочника (использовать с осторожностью внутри транзакции):


// СтрТЧ.Книга — это Ссылка на элемент справочника
КнигаОбъект = СтрТЧ.Книга.ПолучитьОбъект();

Если КнигаОбъект <> Неопределено Тогда
    КнигаОбъект.ПоследнийЧитатель = Читатель;
    КнигаОбъект.Записать();
КонецЕсли;

Важный момент: если вы создаете конфигурацию «с нуля» на управляемых формах, старайтесь избегать подобных конструкций внутри проведения. Лучше выносите логику изменения справочников в отдельные бизнес-процессы или используйте регистры накопления для количественного учета.

Заключение и советы по переходу

Проанализировав ошибки, мы видим, что переход с 7.7 на 8.3 — это отличный повод навести порядок в логике программы. Вместо того чтобы просто искать аналоги функций типа СоздатьОбъект, посмотрите на задачу шире. Используйте регистры сведений для хранения состояний и регистры накопления для учета остатков книг на полках. Это позволит вам строить сложные отчеты (например, «Список должников» или «Рейтинг самых популярных книг») буквально за несколько минут с помощью Системы Компоновки Данных (СКД), чего в 7.7 было добиться гораздо сложнее.

Помните, что в 1С 8.3 основным инструментом получения данных является Запрос. Старайтесь не перебирать справочники в циклах для поиска информации — это замедляет систему. Правильно спроектированная структура метаданных (документы -> регистры) — залог быстрой и стабильной работы вашей библиотечной системы.

← На главную