Как программно создать и заполнить документ Заявка покупателя в 1С 7.7?

Программист 1С v7.7 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации обмена данными или загрузке заказов из внешних источников разработчики сталкиваются с задачей программного создания документов в среде 1С:Предприятие 7.7 (в частности, в конфигурации «Комплексная конфигурация 4.5» или «Торговля и Склад 9.2»). Разберем по шагам, как правильно инициализировать документ ЗаявкаПокупателя, установить реквизиты шапки типа «Перечисление», заполнить строки табличной части товарами и единицами измерения, а также корректно обработать данные из внешних файлов.

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

Проанализируем ключевое отличие программного создания объекта от интерактивного ввода пользователем. При создании документа через форму срабатывают предопределенные процедуры ВводНового() и ПриОткрытии(), расположенные в модуле формы документа. В них разработчики типовых конфигураций обычно прописывают автозаполнение реквизитов по умолчанию: текущего склада, основной фирмы, ставок налогов и договоров.

Когда мы создаем объект через конструкцию СоздатьОбъект("Документ.ЗаявкаПокупателя"), модуль формы не задействуется. Следовательно, все обязательные реквизиты шапки и табличной части необходимо инициализировать явно либо вызывать специальные экспортные процедуры глобального модуля.

Создание документа и заполнение реквизитов шапки

Рассмотрим базовую структуру создания нового документа. Для обращения к значениям перечислений в коде 1С 7.7 используется объект Перечисление, после которого через точку указывается идентификатор самого перечисления и конкретное значение.


ДокЗаявка = СоздатьОбъект("Документ.ЗаявкаПокупателя");
ДокЗаявка.Новый();

// Заполнение даты документа
ДокЗаявка.ДатаДок = ТекущаяДата();

// Заполнение типовых реквизитов шапки с помощью глобальных процедур
глЗаполнитьШапку(ДокЗаявка);

// Установка контрагента и сопутствующих параметров взаиморасчетов
ДокЗаявка.Контрагент = парКлиент;
глПриИзмененииКонтрагента(ДокЗаявка);

// Установка значения перечисления
ДокЗаявка.ВидОперации = Перечисление.ВидыОперацийЗаявок.НаСклад;

Обратите внимание: метод Новый() подготавливает объект к заполнению, но не присваивает ему номер немедленно. Автоматический номер будет назначен при вызове метода Записать() либо принудительно процедурой УстановитьНовыйНомер().

Заполнение строк табличной части и работа с единицами измерения

Перейдем к заполнению табличной части. Для добавления каждой новой позиции используется метод НоваяСтрока(). Распространенной ошибкой начинающих разработчиков является использование метода ВыбратьСтроки() на только что созданном документе, в котором строки еще физически отсутствуют.

Справочник Единицы в конфигурациях 7.7 является подчиненным справочнику Номенклатура. При заполнении единицы измерения строке документа необходимо обязательно учитывать два момента:

  1. Если необходимо получить базовую или основную единицу товара, не требуется выполнять отдельный поиск по справочнику. Достаточно обратиться к соответствующему реквизиту номенклатуры: Номенклатура.БазоваяЕдиница или Номенклатура.ОсновнаяЕдиница.
  2. Наряду с единицей измерения необходимо обязательно заполнять реквизит Коэффициент. Для базовой единицы он всегда равен 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 выполняется корректно: документ сохраняет правильные связи с подчиненными справочниками, содержит все расчетные реквизиты шапки и успешно проводится по регистрам оперативного учета.

← На главную