Примеры кода для 1С 8.x. Часть 4. Документы

Как выбрать и упорядочить документы за период в 1С

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

// найдём все документы поступления за 2020 год
// упорядочив их по возрастанию даты

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

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

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДокументов = РезультатЗапроса.Выбрать();

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

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



Как найти документ по номеру в 1С

&НаСервере
Процедура КакНайтиДокументПоНомеруНаСервере()

// найдём поступление № А-000000001 за 2020 год

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

Запрос.УстановитьПараметр("НачДата", '20200101');
Запрос.УстановитьПараметр("КонДата", '20201231');
Запрос.УстановитьПараметр("ВыбНомер", "А-000000001");

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДокументов = РезультатЗапроса.Выбрать();

Если ВыборкаДокументов.Следующий() Тогда
Сообщить(ВыборкаДокументов.Ссылка);
Иначе
Сообщить("Документ с таким номером не существует!");
КонецЕсли;

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


Как найти документы по реквизиту в 1С

&НаСервере
Процедура КакНайтиДокументПоРеквизитуНаСервере()

// найдём все документы поступления
// от поставщика ООО "Ромашка"

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

Запрос.УстановитьПараметр(
"ВыбПоставщик",
Справочники.Поставщики.НайтиПоНаименованию("ООО ""Ромашка""")
);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДокументов = РезультатЗапроса.Выбрать();

Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(
Строка(ВыборкаДокументов.Ссылка) + " " +
ВыборкаДокументов.Поставщик
);
КонецЦикла;

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



Как выбрать все документы, которые не проведены и не помечены на удаление в 1С

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

// найдём не проведенные и не помеченные на удаление
// документы поступления товаров

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

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДокументов = РезультатЗапроса.Выбрать();

Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(
Строка(ВыборкаДокументов.Ссылка) + " " +
ВыборкаДокументов.Проведен + " " +
ВыборкаДокументов.ПометкаУдаления
);
КонецЦикла;

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



Как найти подчиненные документы в 1С

&НаСервере
Процедура КакНайтиПодчиненныеДокументыНаСервере()

// Рассмотрим работу с подчиненными (связанными) документами
// на примере документов: ПоступлениеТоваровУслуг и СчетФактураПолученный.

// Документ СчетФактураПолученный вводится на основании документа
// ПоступлениеТоваровУслуг, то есть счет фактура является подчиненной
// по отношению к поступлению.

// Факт подчиненности обычно (в типовых) фиксируется в самом подчиненном
// документе через табличную часть ДокументыОснования.
// Почему через табличную часть? Потому что один документ может зависеть
// (быть подчиненным) сразу от нескольких родителей (оснований).

// Пример №1.
// У нас есть ссылка на поступление товаров и услуг. Требуется найти
// счёт-фактуры, которые были введены на основании этого поступления.
// В дереве подчиненности эти фактуры будут подчинены (зависимы) от
// документа поступления.

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

Запрос.УстановитьПараметр("ВыбПоступление",
Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("А-00000005", '20200101')
);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

// Пример №2.
// У нас есть ссылка на счет-фактуру полученную. Требуется найти,
// документы, на основании которых она была введена (родителей).

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

Запрос.УстановитьПараметр("ВыбСчетФактура",
Документы.СчетФактураПолученный.НайтиПоНомеру("А-00000002", '20200101')
);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

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


Как перебрать (перечислить) строки табличной части документа в 1С

&НаСервере
Процедура КакПеречислитьСтрокиИзТабличнойЧастиДокументаНаСервере()

// У документа Поступление есть табличная часть 'Товары'.
// У этой табличной части есть колонки: Номенклатура, Количество,
// Сумма.

ПоступлениеСсылка =
Документы.ПоступлениеТоваров.НайтиПоНомеру(
"А-00000001", '20201231');

// перечислим строки табличной части этого документа

// при помощи объектной техники

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

// при помощи запроса

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

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

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

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

КонецЦикла;

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


Как создать документ в 1С

// создадим новый документ поступление
Поступление = Документы.ПоступлениеТоваров.СоздатьДокумент();
// заполним шапку документа
Поступление.Дата = ТекущаяДата();
Поступление.Поставщик =
Справочники.Поставщики.НайтиПоНаименованию(
"ООО ""Ромашка"""
);
Поступление.Склад =
Справочники.Склады.НайтиПоНаименованию(
"Основной склад"
);
// заполним табличную часть
НоваяСтрока = Поступление.Товары.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию(
"Сапоги"
);
НоваяСтрока.Количество = 2;
НоваяСтрока.Сумма = 3000;


 Как записать документ в 1С

Поступление.Записать(РежимЗаписиДокумента.Запись);


Как провести документ в 1С

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


 Как отменить проведение документа в 1С

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


Как внести изменения в документ по ссылке в 1С

// зачастую у нас есть только ссылка на документ
// и чтобы по ней получить сам объект документа
// для изменения нужно вызывать метод ПолучитьОбъект

// найдём документ под номером А-000000001
// для лаконичности примера воспользуемся не запросом,
// а объектной техникой

СсылкаДокумент = Документы.РеализацияТоваров.НайтиПоНомеру(
"А-000000001",
'20201231' // поиск среди документов 2020 года
);
// нам вернули не сам документ, а ссылку (указатель) на него

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



Как получить пустую ссылку типа документ в 1С

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

Как скопировать существующий документ в 1С

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

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


 Как заблокировать документ перед изменениями в 1С

// выполним блокировку документа
// от изменения другими режимами или пользователями

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


Как создать новый документ на основании другого объекта в 1С

// создадим документ на основании поступления и заполним

// замечание: в модуле объекта документа РеализацияТоваров дополнительно надо создать обработчик ОбработкаЗаполнения(), в который надо вписать код заполнения табличной части

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



Как пометить на удаление документ в 1С

ДокументОбъект.УстановитьПометкуУдаления(Истина);
// метод Записать вызывать не нужно



Как найти и изменить программно движения документа в 1С

&НаСервере
Процедура КакНайтиИИзменитьДвиженияДокументаНаСервере()

// предположим у нас есть ссылка на проведенный
// документ поступления № А-000000001

ПоступлениеСсылка = Документы.ПоступлениеТоваров.НайтиПоНомеру("А-000000001", '20201231');

// мы знаем, что этот документ делает записи по регистру накопления "ТоварыНаСкладах"

// изменим записи по регистру "ТоварыНаСкладах"

ПоступлениеОбъект = ПоступлениеСсылка.ПолучитьОбъект();

// получим набор записей этого документа в регистр ТоварыНаСкладах
НаборЗаписей = ПоступлениеОбъект.Движения.ТоварыНаСкладах;

// прочитаем записи из базы данных
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

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

// изменим запись, удвоив количество
Запись.Количество = Запись.Количество * 2;

КонецЦикла;

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

//запишем набор записей
НаборЗаписей.Записать(Истина); // удалим старые движения и запишем вместо них новые

//внимание! после стандартной перезаписи документа наши изменения вновь будут перезаписаны типовым алгоритмом (если он есть в модуле объекта).

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



Как прочитать движения документа по регистрам запросом в 1С

&НаСервере
Процедура КакПрочитатьДвиженияДокументаЗапросомНаСервере()

// этот приём используется, если не требуется изменять
// найденные записи

// предположим у нас есть ссылка на проведенный
// документ поступления товаров № А-0000000001

ПоступлениеСсылка =
Документы.ПоступлениеТоваров.НайтиПоНомеру(
"А-0000000001", '20201231');

// прочитаем записи по регистру "ТоварыНаСкладах" запросом

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

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

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

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

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



Как изменить проведенный документ, не меняя его в 1С

&НаСервере
Процедура КакИзменитьПроведенныйДокументНеМеняяЕгоДвиженийНаСервере()

// бывает так, что есть проведенный документ
// в уже закрытом периоде и нужно изменить
// некоторое поле документа, но так чтобы
// не поменялись проводки документа

ПоступлениеСсылка =
Документы.ПоступлениеТоваров.НайтиПоНомеру(
"А-0000000001", '20201231');

// Изменим количество в табличной части этого документа
// на 1, но чтобы проводки (движения) остались прежними

Поступление = ПоступлениеСсылка.ПолучитьОбъект();

Для Каждого Строка Из Поступление.Товары Цикл
 Строка.Количество = 1;
КонецЦикла;

// если сейчас просто записать документ
// изменятся его проводки, ведь он уже проведён

// но если установить флаг Загрузка
Поступление.ОбменДанными.Загрузка = Истина;

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

Поступление.Записать();

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

 

Как найти документ по номеру в 1С

&НаСервереБезКонтекста
Функция ПолучитьДокументПоНомеру(Номер, ДатаИнтервала)

 Возврат Документы.РеализацияТоваров.НайтиПоНомеру(Номер, ДатаИнтервала);

КонецФункции



Как открыть форму существующего документа в 1С

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

СсылкаНаДокумент = Документы.РеализацияТоваров.НайтиПоНомеру("А-000000002", '20201231');

ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);

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

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



Как открыть форму выбора документа и отследить её закрытие в 1С

&НаКлиенте
Процедура КакОткрытьФормуВыбораДокумента(Команда)

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

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

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

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

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

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


Как открыть форму списка (журнал) документов с отбором по реквизиту в 1С

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

// откроем список поступлений, оставив
// только те, что от поставщика ООО "Ромашка"

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Поставщик",
НайтиПоставщикаПоИмени("ООО ""Ромашка"""));

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

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

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



Как открыть форму только что созданного, но ещё не записанного документа в 1С

&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоДокумента(Команда)

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

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

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

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

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

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

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

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

// заполним только табличную часть
НоваяСтрока = Поступление.Товары.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию(
"Сапоги"
);
НоваяСтрока.Количество = 2;
НоваяСтрока.Сумма = 3000;

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

КонецПроцедуры
Добавить комментарий