Примеры кода для 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;
// преобразуем документа обратно в данные формы
ЗначениеВДанныеФормы(Поступление, ДанныеФормы);
КонецПроцедуры