Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 дек 2023, 12:50

Заполнение поля реквизита

Автор Egor97, 18 мая 2022, 08:48

0 Пользователей и 1 гость просматривают эту тему.

Egor97

Здравствуйте! В документе1 есть поле с регистрационным номером. Также есть поле, в котором необходимо проставить ссылку на документ2 по регистрационному номеру из документа1. Поля находятся в документе1. Как это реализовать?

alexandr_ll

Egor97, Как найти документ по реквизиту в 1с 8.3, 8.2
https://helpme1s.ru/dokumenty-v-yazyke-1s-8-v-primerax

Документы в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

/// Как выбрать и упорядочить документы за период
/// в 1с 8.3, 8.2

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

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

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

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

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

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

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

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

/// Как найти документ по номеру в 1с 8.3, 8.2

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

// найдём поступление еды № ВМБП-000005 за 2014 год

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

Запрос.УстановитьПараметр("НачДата", '20140101');
Запрос.УстановитьПараметр("КонДата", '20141231');
Запрос.УстановитьПараметр("ВыбНомер", "ВМБП-000005");

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

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

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

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

/// Как найти документы по реквизиту в 1с 8.3, 8.2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/// Как найти подчиненные документы в 1с 8.3, 8.2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

/// Как создать новый документ в 1с 8.3, 8.2

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

/// Как записать документ в 1с 8.3, 8.2

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

/// Как провести документ в 1с 8.3, 8.2

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

/// Как отменить проведение документа в 1с 8.3, 8.2

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

/// Как внести изменения в документ по ссылке в 1с 8.3, 8.2

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

// найдём документ продажа еды под номером ВМБП-000001
// для лаконичности примера воспользуемся не запросом,
// а объектной техникой

СсылкаНаПродажу = Документы.ПродажаЕды.НайтиПоНомеру(
"ВМБП-000001",
'20141231' // поиск среди документов 2014 года
);
// нам вернули не сам документ, а ссылку (указатель) на него

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

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

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

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

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

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

/// Как заблокировать документ перед изменениями
/// в 1с 8.3, 8.2

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

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

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

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

// в модуле документа ПродажаЕды я определил процедуру
// ОбработкаЗаполнения, которая обрабатывает ситуации
// когда мы заполняем один элемент на основании
// данных другого (см. в базе для скачивания)

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

/// Как пометить на удаление документ в 1с 8.3, 8.2

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

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

/// Как найти и изменить программно движения документа
/// по регистрам в 1с 8.3, 8.2

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

// предположим у нас есть ссылка на проведенный
// документ поступления еды № ВМБП-000002

ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');

// мы знаем, что этот документ делает записи по
// двум регистрам:
// - регистр накопления "ЗапасЕды"
// - регистр бухгалтерии "Хозрасчетный"

// наша задача: найти записи по регистру "ЗапасЕды"
// изменить их (например, удвоим количество)
// и записать вместо старых

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

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

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

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

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

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

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

КонецЦикла;

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

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

// теперь движения документа № ВМБП-000002 отличаются от тех,
// что были записаны документом при проведении
// чтобы вернуть их к начальному виду - нужно
// перепровести документ

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

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

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

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

// предположим у нас есть ссылка на проведенный
// документ поступления еды № ВМБП-000002

ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');

// мы знаем, что этот документ делает записи по
// двум регистрам:
// - регистр накопления "ЗапасЕды"
// - регистр бухгалтерии "Хозрасчетный"

// прочитаем записи по регистру "ЗапасЕды" запросом

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

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

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

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

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

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

/// Как изменить проведенный документ, не меняя его
/// движений (проводок) в 1с 8.3, 8.2

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

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

ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000005", '20141231');

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

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

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

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

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

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

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

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

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

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

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

/// Как открыть форму существующего документа
/// по ссылке в 1с 8.3, 8.2

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

СсылкаНаДокумент = ПолучитьПродажуПоНомеру("ВМБП-000006", '20141231');

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

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

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

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

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

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

ОткрытьФорму(
"Документ.ПродажаЕды.ФормаВыбора",,,,,,ОповещениеОЗакрытии
);

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

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

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

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

&НаСервереБезКонтекста
Функция НайтиПоставщикаПоИмени(Имя)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// заполним только табличную часть
НоваяСтрока = Поступление.Еда.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Еда.НайтиПоНаименованию(
"Банан"
);
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = 550;

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

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

/// Скачать и выполнить эти примеры на компьютере

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск