При автоматизации обмена данными или загрузке заказов из внешних источников разработчики сталкиваются с задачей программного создания документов в среде 1С:Предприятие 7.7 (в частности, в конфигурации «Комплексная конфигурация 4.5» или «Торговля и Склад 9.2»). Разберем по шагам, как правильно инициализировать документ ЗаявкаПокупателя, установить реквизиты шапки типа «Перечисление», заполнить строки табличной части товарами и единицами измерения, а также корректно обработать данные из внешних файлов.
Проанализируем ключевое отличие программного создания объекта от интерактивного ввода пользователем. При создании документа через форму срабатывают предопределенные процедуры ВводНового() и ПриОткрытии(), расположенные в модуле формы документа. В них разработчики типовых конфигураций обычно прописывают автозаполнение реквизитов по умолчанию: текущего склада, основной фирмы, ставок налогов и договоров.
Когда мы создаем объект через конструкцию СоздатьОбъект("Документ.ЗаявкаПокупателя"), модуль формы не задействуется. Следовательно, все обязательные реквизиты шапки и табличной части необходимо инициализировать явно либо вызывать специальные экспортные процедуры глобального модуля.
Рассмотрим базовую структуру создания нового документа. Для обращения к значениям перечислений в коде 1С 7.7 используется объект Перечисление, после которого через точку указывается идентификатор самого перечисления и конкретное значение.
ДокЗаявка = СоздатьОбъект("Документ.ЗаявкаПокупателя");
ДокЗаявка.Новый();
// Заполнение даты документа
ДокЗаявка.ДатаДок = ТекущаяДата();
// Заполнение типовых реквизитов шапки с помощью глобальных процедур
глЗаполнитьШапку(ДокЗаявка);
// Установка контрагента и сопутствующих параметров взаиморасчетов
ДокЗаявка.Контрагент = парКлиент;
глПриИзмененииКонтрагента(ДокЗаявка);
// Установка значения перечисления
ДокЗаявка.ВидОперации = Перечисление.ВидыОперацийЗаявок.НаСклад;
Обратите внимание: метод Новый() подготавливает объект к заполнению, но не присваивает ему номер немедленно. Автоматический номер будет назначен при вызове метода Записать() либо принудительно процедурой УстановитьНовыйНомер().
Перейдем к заполнению табличной части. Для добавления каждой новой позиции используется метод НоваяСтрока(). Распространенной ошибкой начинающих разработчиков является использование метода ВыбратьСтроки() на только что созданном документе, в котором строки еще физически отсутствуют.
Справочник Единицы в конфигурациях 7.7 является подчиненным справочнику Номенклатура. При заполнении единицы измерения строке документа необходимо обязательно учитывать два момента:
Номенклатура.БазоваяЕдиница или Номенклатура.ОсновнаяЕдиница.Коэффициент. Для базовой единицы он всегда равен 1. При выборе альтернативной единицы (например, коробки или упаковки) коэффициент переносится из элемента подчиненного справочника: ДокЗаявка.Коэффициент = ДокЗаявка.Единица.Коэффициент. Если не заполнить коэффициент, то движения по регистрам остатков при проведении сформируются с нулевым количеством.Посмотрим на пример правильного заполнения строки документа номенклатурой с расчетом сумм:
// Добавляем новую строку в табличную часть
ДокЗаявка.НоваяСтрока();
ДокЗаявка.Номенклатура = ВыбранныйТовар;
// Установка базовой единицы и коэффициента
ДокЗаявка.Единица = ДокЗаявка.Номенклатура.БазоваяЕдиница;
ДокЗаявка.Коэффициент = 1;
// Заполнение количественно-суммовых показателей
ДокЗаявка.Количество = 10;
ДокЗаявка.Цена = 150;
// Вызов типового пересчета налогов и сумм строки
глПересчетТаблЧасти(ДокЗаявка, "Цена");
Если требуется найти конкретную единицу измерения по наименованию (например, «шт»), проанализируем синтаксис работы с подчиненным справочником:
СпрЕд = СоздатьОбъект("Справочник.Единицы");
// Обязательно указываем владельца перед поиском
СпрЕд.ИспользоватьВладельца(ВыбранныйТовар);
Если СпрЕд.НайтиПоНаименованию("шт", 0, 1) = 1 Тогда
ДокЗаявка.Единица = СпрЕд.ТекущийЭлемент();
ДокЗаявка.Коэффициент = СпрЕд.Коэффициент;
Иначе
// Если единица не найдена, используем базовую по умолчанию
ДокЗаявка.Единица = ДокЗаявка.Номенклатура.БазоваяЕдиница;
ДокЗаявка.Коэффициент = 1;
КонецЕсли;
После обхода всех строк табличной части необходимо пересчитать общую сумму документа с учетом валюты взаиморасчетов договора и налоговых настроек (НДС и НП), после чего записать или провести документ:
// Расчет итоговой суммы взаиморасчетов по типовым алгоритмам конфигурации
ДокЗаявка.СуммаВзаиморасчетов = глПересчет(
ДокЗаявка.Итог("Сумма") +
?(ДокЗаявка.СуммаВклНП = 1, 0, ДокЗаявка.Итог("СуммаНП")) +
?(ДокЗаявка.СуммаВклНДС = 1, 0, ДокЗаявка.Итог("СуммаНДС")),
ДокЗаявка.Валюта,
ДокЗаявка.Курс,
ДокЗаявка.Договор.ВалютаВзаиморасчетов,
ДокЗаявка.ДатаДок
);
// Сохранение документа в информационной базе
ДокЗаявка.Записать();
// Если требуется сразу сформировать движения по регистрам (провести):
// Если дата документа меньше точки актуальности (ТА), проводим неоперативно
Если ДокЗаявка.ДатаДок < ПолучитьДатуТА() Тогда
ДокЗаявка.Провести(РежимПроведения.Неоперативный);
Иначе
ДокЗаявка.Провести(РежимПроведения.Оперативный);
КонецЕсли;
При чтении артикулов, кодов или чисел из таблиц Excel разработчики часто сталкиваются с ситуацией, когда функция Найти(Строка, " ") возвращает 0, а преобразование строки Число(Строка) отсекает значащие цифры после первого пробела (например, число "259 006" преобразуется только в 259).
Выясним причину такого поведения: в таблицах Microsoft Excel в качестве разделителя групп разрядов часто используется не стандартный пробел (ASCII-код 32), а символ неразрывного пробела с кодом 160. В платформе 1С 7.7 нет предопределенной константы типа Символы.НПП, поэтому для работы с таким знаком используется встроенная функция Симв(160).
Разберем, как корректно очистить строку от неразрывных и обычных пробелов перед преобразованием в число или поиском в справочнике:
ИсходныйТекст = ТЗ1.Код1;
// Удаляем неразрывные пробелы (код 160)
ЧистыйТекст = СтрЗаменить(ИсходныйТекст, Симв(160), "");
// Удаляем стандартные пробелы (код 32)
ЧистыйТекст = СтрЗаменить(ЧистыйТекст, " ", "");
// Если в данных присутствует дробная часть, заменяем точку на запятую
ЧистыйТекст = СтрЗаменить(ЧистыйТекст, ".", ",");
// Преобразуем очищенную строку в число
РезультирующееЧисло = Число(ЧистыйТекст);
С помощью описанных подходов создание документов ЗаявкаПокупателя в 1С 7.7 выполняется корректно: документ сохраняет правильные связи с подчиненными справочниками, содержит все расчетные реквизиты шапки и успешно проводится по регистрам оперативного учета.