1С 8.3 Документы - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Документы

Данные > Примеры кода 1С > 1С 8.3 Документы
Документы в 1С 8.3 - это прикладные объекты конфигурации и метаданных, которые фиксируют хозяйственные операции предприятия и используются для хранения данных об их событиях. Например: приказы о приеме на работу, документы поступления товаров, платежные поручения, выписки, отгрузки товаров, и тому подобные. Каждому документу в 1С автоматически присваивается номер, дата и время создания документа. Благодаря этим характеристикам можно увидеть, какой из документов был сделан раньше либо позднее.
К скачиванию доступны:

Оглавление:
Создание и изменение документов в 1С 8.3:
&НаСервере
Процедура СозданиеИИзменениеДокументов()

   
// Cоздание нового документа Отгрузка товаров
   
Отгрузка = Документы.ОтгрузкаТоваров.СоздатьДокумент();

   
// Заполнение шапки документа
   
Отгрузка.Дата = ТекущаяДата();
   
Отгрузка.Покупатель Справочники.Покупатели.НайтиПоНаименованию("ООО ""Виста-медиа-групп""");
   
Отгрузка.Склад = Справочники.Склады.НайтиПоНаименованию("Склад №98");

   
// Заполнение табличной части Номенклатура
   
НоваяСтрока = Отгрузка.Номенклатура.Добавить();
   
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("SSD Intel Optane DC P4800X 1.5TB");
   
НоваяСтрока.Количество = 3;
   
НоваяСтрока.Сумма = 1926900;

   
// Запись документа
   
Отгрузка.Записать(РежимЗаписиДокумента.Запись);

   
// Проведение документа
   
Отгрузка.Записать(РежимЗаписиДокумента.Проведение);

   
// Отмена проведения документа
   
Отгрузка.Записать(РежимЗаписиДокумента.ОтменаПроведения);

   
// Внесение изменений в документ по ссылке (для этого вызываем метод ПолучитьОбъект)
   
СсылкаНаОтгрузку = Документы.ОтгрузкаТоваров.НайтиПоНомеру("МРБ-000123", '20200101'); // поиск по документам 2020 года
   
Если СсылкаНаОтгрузку.Пустая() Тогда
       
Сообщить("Документ не найден.");
    Иначе
       
Отгрузка = СсылкаНаОтгрузку.ПолучитьОбъект(); // Получение самого документа, а не ссылки
       
Отгрузка.Склад = Справочники.Склады.НайтиПоНаименованию("Склад №23");
       
Отгрузка.Записать();
    КонецЕсли;

   
// Получение пустой ссылки типа документ
   
ПустаяСсылка = Документы.ОтгрузкаТоваров.ПустаяСсылка();
    Если
ПустаяСсылка.Пустая() Тогда
       
// Истина
   
КонецЕсли;

   
// Копирование существующего документа
   
КопияПродажи = СсылкаНаОтгрузку.Скопировать();
   
КопияПродажи.Дата = ТекущаяДата();

   
// Запись и проведение документа
   
КопияПродажи.Записать(РежимЗаписиДокумента.Проведение);

   
// Блокировка документа перед изменениями
   
Отгрузка = СсылкаНаОтгрузку.ПолучитьОбъект();
    Если Не
Отгрузка.Заблокирован() Тогда
       
Отгрузка.Заблокировать();
       
Отгрузка.Склад = Справочники.Склады.НайтиПоНаименованию("Склад №51");
       
Отгрузка.Комментарий = "Документ изменён.";
       
Отгрузка.Записать();
       
Отгрузка.Разблокировать();
    КонецЕсли;

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

   
// Пометка на удаление документа
   
СчетНаОсновании.УстановитьПометкуУдаления(Истина); // метод Записать не используется

КонецПроцедуры
Обход строк табличной части документа в 1С 8.3:
&НаСервере
Процедура ОбходСтрокТабличнойЧастиДокумента()

   
// У документа ОтгрузкаТоваров есть табличная часть: Номенклатура.
    // У этой табличной части есть колонки: Номенклатура, Количество, Сумма.
   
ОтгрузкаСсылка = Документы.ОтгрузкаТоваров.НайтиПоНомеру("МРБ-000123", '20200430');

   
// Вариант №1: При помощи объектной техники
   
Для Каждого Строка Из ОтгрузкаСсылка.Номенклатура Цикл
       
Сообщить("отгружено: "+Строка.Номенклатура.Наименование + " на сумму " + Строка.Сумма + " руб.
       
( количество = " + Строка.Количество + ")");
   
КонецЦикла;

   
// Вариант №2: При помощи запроса
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   ОтгрузкаТоваров.Номенклатура,
    |   ОтгрузкаТоваров.Количество,
    |   ОтгрузкаТоваров.Сумма
    |ИЗ
    |   Документ.ОтгрузкаТоваров.Номенклатура КАК ОтгрузкаТоваровТовар
    |ГДЕ
    |   ОтгрузкаТоваровТовар.Ссылка = &ВыбОтгрузка"
;
   
Запрос.УстановитьПараметр("ВыбОтгрузка", ОтгрузкаСсылка);
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл

       
Сообщить("отгружено: "+ВыборкаДетальныеЗаписи.Номенклатура.Наименование + " на сумму " +
       
ВыборкаДетальныеЗаписи.Сумма + " руб. ( количество = " + ВыборкаДетальныеЗаписи.Количество + ")");

    КонецЦикла;

КонецПроцедуры
Поиск документа по номеру в 1С 8.3:
&НаСервере
Процедура ПоискДокументаПоНомеру()

   
// Поиск документов Отгрузки товаров № МРБ-000123 за 2020 год
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   Ссылка
    |ИЗ
    |   Документ.ОтгрузкаТоваров КАК ОтгрузкаТоваров
    |ГДЕ
    |   Дата МЕЖДУ &ДатаНач И &ДатаКон И
    |   Номер = &ВыбНомер"
;

   
Запрос.УстановитьПараметр("ДатаНач", '20200101');
   
Запрос.УстановитьПараметр("ДатаКон", '20201231');
   
Запрос.УстановитьПараметр("ВыбНомер", "МРБ-000123");
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДокументов = РезультатЗапроса.Выбрать();
    Если
ВыборкаДокументов.Следующий() Тогда

       
ТекДокСсылка=ВыборкаДокументов.Ссылка;

    КонецЕсли;

КонецПроцедуры
Поиск документа по реквизиту в 1С 8.3:
&НаСервере
Процедура ПоискДокументаПоРеквизиту()

   
// Поиск всех отгрузок покупателю ООО "Виста-медиа-групп"
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   Ссылка,
    |   Покупатель
    |ИЗ
    |   Документ.ОтгрузкаТоваров КАК ОтгрузкаТоваров
    |ГДЕ
    |   Покупатель = &ВыбПокупатель
    |УПОРЯДОЧИТЬ ПО
    |   Дата ВОЗР"
;

   
Запрос.УстановитьПараметр("ВыбПокупатель",Справочники.Покупатели.НайтиПоНаименованию("ООО ""Виста-медиа-групп"""));
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДокументов = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДокументов.Следующий() Цикл

       
Сообщить(ВыборкаДокументов.Покупатель + " (" + Строка(ВыборкаДокументов.Ссылка) + ")");

    КонецЦикла;

КонецПроцедуры
Поиск подчиненных документов в 1С 8.3:
&НаСервере
Процедура ПоискПодчиненныхДокументов()
   
// Например: Документ Путевой Лист(является подчиненным) вводится на основании документа ОтгрузкаТоваров

    // Вариант №1: Есть ссылка на путевой лист. Нужно найти родителей: Отгрузки товаров, на основании которых был введен Путевой лист.
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |    ДокументОснование
    |ИЗ
    |    Документ.ПутевойЛист.ДокументыОснования КАК
    |    ПутевойЛистДокументыОснования
    |ГДЕ
    |    ПутевойЛистДокументыОснования.Ссылка = &ВыбПутевойЛист"
;

   
Запрос.УстановитьПараметр("ВыбПутевойЛист", Документы.ПутевойЛист.НайтиПоНомеру("ПЛ00007416", '20200430'));
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл

       
РодительПутевогоЛиста = ВыборкаДетальныеЗаписи.ДокументОснование;

    КонецЦикла;

   
// Вариант №2: Есть ссылка на отгрузку товаров. Нужно найти Путевые листы, которые были введены на основании этой отгрузки.
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |    Ссылка
    |ИЗ
    |    Документ.ПутевойЛист.ДокументыОснования КАК
    |    ПутевойЛистДокументыОснования
    |ГДЕ
    |    ПутевойЛистДокументыОснования.ДокументОснование = &ВыбОтгрузкаТоваров"
;

   
Запрос.УстановитьПараметр("ВыбОтгрузкаТоваров", Документы.ОтгрузкаТоваров.НайтиПоНомеру("МРБ-000123", '20200430'));
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл

       
ПодчиненныйПутевойЛист = ВыборкаДетальныеЗаписи.Ссылка;

    КонецЦикла;

КонецПроцедуры
Поиск и программное изменение движения документа по регистрам в 1С 8.3:
&НаСервере
Процедура ПоискИИзменениеДвиженияДокументаПоРегистрам()

   
ОтгрузкаСсылка = Документы.ОтгрузкаТоваров.НайтиПоНомеру("МРБ-000123", '20200430');
   
Отгрузка = ОтгрузкаСсылка.ПолучитьОбъект();

   
НаборЗаписей = Отгрузка.Движения.МестоХранения;
   
НаборЗаписей.Прочитать();

    Для Каждого
Запись Из НаборЗаписей Цикл
       
// Изменение записи, утроив количество
       
Запись.Количество = Запись.Количество * 3;
    КонецЦикла;

   
// Добавление новой записи
   
НоваяЗапись = НаборЗаписей.ДобавитьПриход();
   
НоваяЗапись.Склад = Справочники.Склады.НайтиПоНаименованию("Склад №51");
   
НоваяЗапись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("SSD Huawei 02351SPX 1.92TB");
   
НоваяЗапись.Количество = 2;
   
НоваяЗапись.Период = ТекущаяДата();
   
НаборЗаписей.Записать(Истина); // Удаление старых движений и запись вместо них новых
    // Если документ перепровести - проводки вернутся в свое первоначальное значение

КонецПроцедуры
Чтение запросом движения документа по регистрам (без возможности изменения) в 1С 8.3:
&НаСервере
Процедура ЧтениеДвиженияДокументаПоРегистрам()

   
ОтгрузкаСсылка = Документы.ОтгрузкаТоваров.НайтиПоНомеру("МРБ-000123", '20200430');

   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   МестоХранения.НомерСтроки,
    |   МестоХранения.ВидДвижения,
    |   МестоХранения.Номенклатура,
    |   МестоХранения.Количество
    |ИЗ
    |   РегистрНакопления.МестоХранения КАК МестоХранения
    |ГДЕ
    |   МестоХранения.Регистратор = &ВыбРегистратор
    |УПОРЯДОЧИТЬ ПО
    |   МестоХранения.НомерСтроки"
;

   
Запрос.УстановитьПараметр("ВыбРегистратор", ОтгрузкаСсылка);
   
РезультатЗапроса = Запрос.Выполнить();

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

КонецПроцедуры
Выбор и сортировка (упорядочивание) документов за период в 1С 8.3:
&НаСервере
Процедура ВыборИСортировкаУпорядочиваниеДокументовЗаПериод()

   
// Перебор всех документов ОтгрузкаТоваров за 2020 год и упорядочивание их по возрастанию даты
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   Ссылка
    |ИЗ
    |   Документ.ОтгрузкаТоваров КАК ОтгрузкаТоваров
    |ГДЕ
    |   Дата МЕЖДУ &ДатаНач И &ДатаКон
    |УПОРЯДОЧИТЬ ПО
    |   Дата ВОЗР"
;

   
Запрос.УстановитьПараметр("ДатаНач", '20200101');
   
Запрос.УстановитьПараметр("ДатаКон", '20201231');
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДокументов = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДокументов.Следующий() Цикл

       
ТекДокСсылка=ВыборкаДокументов.Ссылка;

    КонецЦикла;

КонецПроцедуры
Выборка всех документов, которые не проведены и не помечены на удаление в 1С 8.3:
&НаСервере
Процедура ВыборкаДокументовКоторыеНеПровИНеПомечНаУдаление()

   
// Поиск не проведенных и не помеченных на удаление документов отгрузок товаров
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   Ссылка,
    |   Проведен,
    |   ПометкаУдаления
    |ИЗ
    |   Документ.ОтгрузкаТоваров КАК ОтгрузкаТоваров
    |ГДЕ
    |   Проведен = ЛОЖЬ И
    |   ПометкаУдаления = ЛОЖЬ
    |УПОРЯДОЧИТЬ ПО
    |   Дата ВОЗР"
;
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДокументов = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДокументов.Следующий() Цикл

       
Сообщить("<"+ВыборкаДокументов.Проведен + ", " + ВыборкаДокументов.ПометкаУдаления + "> " + Строка(ВыборкаДокументов.Ссылка));

    КонецЦикла;

КонецПроцедуры
Изменение проведенного документа, без изменения его движения (проводок) в 1С 8.3:
&НаСервере
Процедура ИзменениеПроведенногоДокументаБезИзменения()

   
ОтгрузкаСсылка = Документы.ОтгрузкаТоваров.НайтиПоНомеру("МРБ-000123", '20200430');
   
// Изменим количество в табличной части на 4, но чтобы проводки (движения) остались прежними
   
Отгрузка = ОтгрузкаСсылка.ПолучитьОбъект();

    Для Каждого
СтрокаТЧ Из Отгрузка.Номенклатура Цикл
       
СтрокаТЧ.Количество = 4;
    КонецЦикла;

   
Отгрузка.ОбменДанными.Загрузка = Истина; // Для того, чтобы документ не перепровелся
   
Отгрузка.Записать(); // Будет записан, но не перепроведен

КонецПроцедуры
Открытие формы существующего документа по ссылке в 1С 8.3:
&НаКлиенте
Процедура ОткрытиеФормыСуществующегоДокумента(Команда)

   
СсылкаНаДок = ПолучитьДокПоНомеру("МРБ-000123", '20200101');
   
ПарамФормы = Новый Структура("Ключ", СсылкаНаДок);

   
//Параметры: Имя формы, параметры для формы
   
ОткрытьФорму("Документ.ОтгрузкаТоваров.ФормаОбъекта", ПарамФормы);

КонецПроцедуры

&НаСервере
Функция ПолучитьДокПоНомеру(НомерТекДок, ИнтервалДатГод)

    Возврат
Документы.ОтгрузкаТоваров.НайтиПоНомеру(НомерТекДок, ИнтервалДатГод);

КонецФункции
Открытие формы выбора документа и отслеживание её закрытия в 1С 8.3:
&НаКлиенте
Процедура ОткрытиеФормыВыбораДокументаИОтслеживаниеЗакрытия(Команда)

   
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораДокумента", ЭтотОбъект);

   
ОткрытьФорму("Документ.ОтгрузкаТоваров.ФормаВыбора",,,,,,ОповещениеОЗакрытии);

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораДокумента(Рез, Пар) Экспорт

    Если
Рез <> Неопределено Тогда
       
Сообщить("Документ не был выбран " + Рез);
    КонецЕсли;

КонецПроцедуры
Открытие формы списка (журнала) документов с отбором по реквизиту в 1С 8.3:
&НаКлиенте
Процедура ОткрытиеФормыСпискаДокументовСОтбором(Команда)

   
// Продажи только для покупателя ООО "Виста-медиа-групп"
   
ОтборП = Новый Структура;
   
ОтборП.Вставить("Покупатель", ПоискПоИмени("ООО ""Виста-медиа-групп"""));

   
СтруктураП = Новый Структура;
   
СтруктураП.Вставить("Отбор", ОтборП);

   
ОткрытьФорму("Документ.ОтгрузкаТоваров.ФормаСписка", СтруктураП);

КонецПроцедуры

&НаСервере
Функция ПоискПоИмени(НаименованиеПокупателя)

    Возврат
Справочники.Покупатели.НайтиПоНаименованию(НаименованиеПокупателя);

КонецФункции
Открытие формы только что созданного, но ещё не записанного документа в 1С 8.3:
&НаКлиенте
Процедура ОткрытиеФормыНеЗаписанногоДокумента(Команда)

   
// Получение формы нового документа
   
ФормаНовДок = ПолучитьФорму("Документ.ОтгрузкаТоваров.ФормаОбъекта",, Истина);

   
// Копирование данных (напрямую менять нельзя)
   
КопияДанных = ФормаНовДок.Объект;

   
// Заполнение данных НаСервере
   
ЗаполнениеДанныхФормы(КопияДанных);

   
// Копирование данных в исходную форму
   
КопироватьДанныеФормы(КопияДанных, ФормаНовДок.Объект);

   
// Откроем пользователю форму нового (заполненного) документа
   
ФормаНовДок.Открыть();

КонецПроцедуры

&НаСервере
Процедура ЗаполнениеДанныхФормы(ДанныеКопииФормы)

   
// Преобразование в документ
   
Отгрузка = ДанныеФормыВЗначение(ДанныеКопииФормы, Тип("ДокументОбъект.ОтгрузкаТоваров"));

   
// Заполнение только табличной части
   
Строка = Отгрузка.Номенклатура.Добавить();
   
Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("SSD Intel Optane DC P4800X 1.5TB");
   
Строка.Количество = 5;
   
Строка.Сумма = 3211500;

   
// Преобразование обратно в форму
   
ЗначениеВДанныеФормы(Отгрузка, ДанныеКопииФормы);

КонецПроцедуры
📰 Актуальные новости с тегом #Документы:
  • В версии 8.3.27 увеличено количество записей в табличных частях. В более ранних версиях можно было хранить до 99 999 записей. В ОбъектМетаданныхТабличнаяЧасть добавлено новое свойство – ДлинаНомераСтроки. Свойство может принимать целочисленное значение в диапазоне от 5 до 9 включительно, что позволяет хранить в табличной части до 999 999 999 записей.
  • В версии 8.3.26 в менеджер объектов добавлен метод ВыбратьПоСсылкам.
  • В версии 8.3.26 реализована поддержка журналов документов в расширениях.
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 30.04.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому