Как найти документ 1с8

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

/

/

/

Совет: Эффективный поиск по спискам документов – Как в 1С 8.3 найти документ в списке?

25.11.2019

Функционал программы 1С позволяет гибко настраивать списки, что позволяет легче ориентироваться в документах и осуществлять быстрый поиск. На примере 1С:Бухгалетрии 8 рассмотрим способы быстрого поиска и наглядной организации информации в списке документов.

Базовые инструменты отбора и сортировки встроены сразу в форму списка, и могут облегчить поиск документов 1С в самых распространенных случаях – когда необходим отбор по контрагенту или организации, либо когда необходимо сортировать список по данным любого столбца, например по статусу оплаты. Для этого нужно щелкнуть левой кнопкой по заголовку столбца (щелкнуть дважды, чтобы инвертировать сортировку).

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

Также через контекстное меню при нажатии правой кнопкой мыши на любом документе (или сочетанием клавиш Ctrl + F) можно вызвать «Расширенный поиск» – простой отбор по значению в любой из колонок, поиск можно осуществить по точному совпадению с поисковой фразой, по началу строки или по любой части строки. Так же через контекстное меню можно произвести отбор по дате документа с помощью функции «Установить период…». Функции можно применять последовательно, например, ограничить временным периодом список с результатами расширенного поиска.

расширенный поиск и ограничение по периоду документов 1С

Однако базовых возможностей поиска оказывается недостаточно, когда документов очень много и из них нужно найти определенные. Например, оставить в списке только непроведенные документы, или найти документ сразу по нескольким условиям. Расширенный функционал отбора и сортировки находится в меню «Еще…», кнопка «Настроить список…»

расширенный поиск документов в списке 1С 8.3 – сложный отбор и сортировка

Обратимся к вкладке «Отбор». Справа в столбце расположены все реквизиты документов, по которым их можно отфильтровать. Структура реквизитов иерархическая – можно осуществлять отбор по основному реквизиту (например по Контрагенту), либо по подчиненному (например, по ИНН контрагента, либо по характеристике юр./физ. лицо). Также можно создавать сложные отборы – то есть сразу по нескольким реквизитам документов 1С. Так, в примере ниже, в списке счетов мы осуществляем отбор по сумме счета (не менее 10 000 руб.) и статусу оплаты (не оплачен).

поиск документов в списке 1С - отбор счетов в 1С Бухгалтерии 8.3

На следующей вкладке расположено окно сортировки – здесь можно задать тонкую настройку сортировки списка документов по любым реквизитам, в том числе сложные варианты сортировки по нескольким реквизитам.

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

Далее, когда вам потребуется сбросить настройки поиска, сортировки и отбора документов 1С, вы можете вернуться к стандартным настройкам списка. Для этого в окне настройки списка нажмите на кнопку «Еще…», затем – «Установить стандартные настройки».

отключить поиск и отбор документов в списке 1С 8.3

Помимо этого, вы можете организовать реквизиты в списке любым удобным образом, или даже добавить для отображения новые. Для этого через меню «Еще…» откройте окно «Изменить форму…»

открыть окно изменения формы списка документов 1С 8.3

Например, реквизит «Комментарии» стандартно находится с крайней правой части окна списка и комментария может быть не видно без дополнительной прокрутки. В примере мы изменим местоположение реквизита комментарий, чтобы он отображался правее. Для этого реквизит нужно «поднять».

изменить место отображения реквизита 1С 8.3

Помимо этого, вы можете добавить новые реквизиты для отображения. Так, для примера мы добавим в отображение новый реквизит – телефон контрагента.

добавить новый реквизит для отображения в список документов 1С 8.3

Пройдите курсы 1С и Вам больше не понадобятся советы и руководства!

Расписание курсов 1C

Подпишитесь на нас!

И получите в подарок промокод на 1500 руб! Все новые статьи, акции и анонсы каждую неделю:

 0 

   

Распечатать

1С 8.x : Найти и открыть документ

Код 1C v 8.х

 
// Найти и открыть документ
Результат = Документы.РасходнаяНакладная.НайтиПоНомеру(НомерДок, РабочаяДата);
Если Результат.Пустая() Тогда
Предупреждение("Документ не найден!");
Иначе
Результат.ПолучитьФорму().Открыть();
КонецЕсли;

//Найти документ и обработать
ИскомыйДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(НомерДок, Дата(2005, 1, 1));
Если НЕ ИскомыйДокумент.Пустая() Тогда
// Выполнить действия в случае обнаружения такого документа. …
КонецЕсли;

//Выборка запросом
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ. РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Контрагент = &Контрагент
| И
| (РеализацияТоваровУслуг.Номер < 100 ИЛИ РеализацияТоваровУслуг.Дата < ДАТАВРЕМЯ(2005, 1, 1))
| И
| РеализацияТоваровУслуг.Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)";

Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
РезультатЗапроса = Запрос.Выполнить();
Результат = РезультатЗапроса.Выгрузить();
Для Каждого ТекущаяСтрока Из Результат Цикл
// Выполнить действия...
КонецЦикла;

Первый способ. Поиск в форме списка документов

Всего в программе есть три списка документов разделенных по типам: Внутренние Документы, Входящие Документы, Исходящие Документы.  Данный способ подходит для случая, когда вы наверняка знаете к какому типу документов относится искомый документ. По умолчанию все три списка выглядят одинаково. В каждом из них можно использовать любой из следующих вариантов.

a. Быстрые отборы

В шапке форме списка есть группа быстрых отборов. Можно делать отборы только по одному реквизиту или по нескольким:

1.png

Поиск будет происходить в выбранном реквизите по точному совпадению.

2.png

Также на форму можно вывести дополнительные отборы через “Еще” -”Настройки”-”Изменить форму” установив или сняв галочками виды отборов:

3.png

Не забывайте снимать отборы (нажать на крестик в поле быстрого поиска), иначе ваш выбор сохранится при повторном открытии формы и вы увидите только отобранные ранее документы. 

б. Поле поиска

4.png

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

5.png

При наличие большого количества документов в базе для ускорения времени поиска рекомендуется сделать также быстрый отбор по периоду. Например, текущий год.

в. Расширенный поиск

При необходимости искать по конкретному реквизиту который мы видим в списке, можно воспользоваться расширенным поиском:

6.png

В поле “Где искать” можно выбрать только те реквизиты, которые выведены на форму (которые мы видим на экране).

7.png

В отличие от поиска через быстрые отборы или поле поиска мы можем выбрать как искать: по началу строки, по части строки, по точному совпадению.

8.png

Чтобы снова увидеть все документы, нужно нажать на крестик в текущем отборе, который появился над списком документов.

г. Настройка списка

Если вы часто пользуетесь какими-то отборами через поле поиска или расширенный поиск, то можно сохранить их через “Еще”- “Настройки” — “Настроить список”

На вкладке “Отбор” можно выбрать любой реквизит документа из левой колонки “Доступные поля” и кликнуть по нему два раза (1), выбрать вид сравнения(2) и с чем сравнивать (3), после этого сохранить настройки нажав “Завершить редактирование”.

9.png

В шапке формы появятся наши персональные настройки:

10.png

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

Чтобы совсем удалить с формы эти настройки требуется перейти повторно в настройки списка на вкладку отборы и нажать “Удалить”.

д. Показывать помеченные на удаление

В случае, если документ был помечен на удаление или была нажата кнопка “Delete”, он пропадает из общего списка документов. Если администратор вашей базы или фоновое задание, которое выполняется по расписанию еще не успели удалить все помеченные на удаление объекты, то восстановить такой документ можно, что через “Еще”-”Настройки”- “Показывать удаленные”. Тогда документ появится в списке в зачеркнутом виде:

11.png 

Останется только нажать “Еще “- “Документы”-“Пометить на удаление/Снять пометку”

e.  Настройка просмотра

В меню “Еще”- “Просмотр” можно выбрать варианты просмотра документов, при котором в левой колонке появляется список того, по чему можно сгруппировать документы:

12.png

При этом если в левой колонке выделить один из элементов, то  в списке документов происходит отбор по выделенному элементу:

13.png

Второй способ. Обработка “Поиск документов и файлов”

Данная обработка находится в разделе “Документы и файлы”- “Сервис”. И подходит для поиска по всем трем типам документов, а также по всем реквизитам документов. Требуется выбрать область поиска (1), например, по всем типам документов или только по одному, что искать(2) по одному или нескольким реквизитам и запустить поиск (3).

В примере ниже поиск происходит по всем типам документов, у которых в реквизите “Содержание” есть текст “строит”, чтобы найти все слова “строительный”, “строитель”, “перестроить” и т.п.

14.png

Результат будет выглядеть в виде отдельных списков из найденных документов:

15.png

Третий способ. Полнотекстовый поиск

Полнотекстовый поиск находится в “Документы и файлы”- “Сервис” или по значку лупы справа наверху возле имени пользователя, под которым вы вошли в программу:

16.png

Третий способ производит поиск по всей информации, которая есть в информационной базе. Это может быть как значение поля карточки документа, так и название этого реквизита или папки в котором он находится или любой другой объект базы. Также поиск происходит по содержимому прикрепленного к карточке файла и всех его версий.

17.png

Четвертый способ. Список “Мои документы”

Cписок “Мои документы” находится в “Документы и файлы” — “Мои документы” и на начальной странице, если у вас там выведен виджет “Мои документы” на форме “Текущие дела”.

18.png

19.png

В этом списке находятся документы, которые относятся к вам и по которым могут требоваться какие-то действия: 

  • все документы, по которым вам направлена задача. После выполнения задачи документы перестанут отображаться в списке;

  • все документы, по которым вы направили задачу другому сотруднику. После выполнения задачи документы также перестанут отображаться в списке;

  • входящие документы, созданные вами. Документы исчезнут из списка после регистрации;

  • исходящие документы, созданные вами. Документы исчезнут из списка после регистрации и отправки;

  • внутренние документы, созданные вами. Документы исчезнут из списка после регистрации и исполнения;

  • документы, за которые вы назначены ответственным. Эти документы можно исключить из списка только вручную.

Подпишитесь на дайджест!

Подпишитесь на дайджест, и получайте ежемесячно подборку полезных статей.

Пятый способ. Отчеты

В программе предусмотрено большое количество настроенных отчетов. Отчеты по документам находятся в “Документы и файлы” — “Отчеты”. С помощью этих отчетов можно найти документ по разным критериям исходя из названия отчета.

20.png

Например, отчет “Неподписанные внутренние документы”:

21.png

Кликнув в отчете на найденный документ откроется карточка этого документа.

Шестой способ. По контрагенту

Когда необходимо посмотреть все документы по определенному контрагенту, можно воспользоваться справочником “Контрагенты”, который находится в “Документы и файлы” — “Контрагенты”. В карточке контрагента есть гиперссылка на все документы, к нему относящиеся.

22.png

23.png

Седьмой способ. Категории (доступен только в версии КОРП и ДГУ)

При включенной настройки Категорий (настройка на уровне всей программы) в документах появляется вкладка “Категории”.

24.png

Категории — это дополнительная классификация или теги документов.  Категории можно устанавливать вручную или автоматически по настроенным критериям.  После этого в “Документы и файлы” — “Категории” можно подобрав категории сразу найти все подходящие по отбору документы.

25.png

Восьмой способ. Поиск по штрихкоду (доступен только в версии КОРП и ДГУ)

В КОРП /ДГУ версии каждому документу по умолчанию назначается штрихкод. Штрихкод можно визуально установить программно в прикрепленном файле или распечатать на наклейке при наличии специального оборудования для печати наклеек. После этого при подключенном сканере шрихкодов можно отсканировать штрихкод и в программе откроется нужная карточка этого документа.

26.png

Если документ приходит в нашу организацию со своим штрихкодом, то, чтобы избежать случайностей при сканировании штрихкодов, его можно также указать в программе, как внешний. После этого поиск будет доступен и по нему.

27.png

Поиск можно производить по номеру штрихкода без подключенного сканера штрихкодов. Такой поиск вызывается сочетанием клавиш Ctrl+Shift+I.

28.png

Девятый способ. Избранное и История

Список документов (и других ссылок в программе), которые были добавлены в избранное или список последних просмотренных документов, доступны по соответствующим значкам справа наверху возле имени текущего пользователя.

Избранное:

29.png

30.png

История (Список последних):

31.png

32.png

Также эти списки можно вывести на начальной странице с помощью Настройки — Настройки начальной страницы:

33.png

34.png

Чтобы добавить документ в избранное нужно нажать на значок звездочки возле наименования документа:

35.png

Десятый способ. Как найти физическое местоположение документа

а. Журнал передачи

36.png

Запись журнала передачи можно внести (по кнопке “создать”) на контактное лицо Контрагента или на нашего сотрудника. В этом же списке можно видеть всю историю передач по этому документу.

37.png

Проводить сводный анализ переданных документов можно по общему списку журнала передачи (“Документы и файлы” — “Журнал передачи”)

38.png

или по отчетам в разделе “Документы и файлы” — “Отчеты” — “По всем документам”:

39.png

б. Учет документов по местам хранения

При включенной настройки учета по местам хранения в видах документа можно вести учет по местам хранения и ответственным лицам за хранение. В месте хранения можно указывать заранее введенные места из справочника или в виде произвольной строки.

40.png

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

Содержание

Немного о документах

Документы – краеугольный камень в построении большинства учетных систем средствами платформы 1С Предприятие. Они предназначены преимущественно для отражения совершенных хозяйственных операций, а также для последующего просмотра и редактирования.

Виды документов, которые создаются в конфигураторе на этапе проектирования прикладного решения, в основном соответствуют своим бумажным аналогам – приходным накладным, документам продажи или актам об оказании услуг, и др. Для каждой отрасли и вида учета набор таких документов и их реквизитный состав может отличаться.

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

Документы описываются в системе 1С двумя стандартными реквизитами – Номер и Дата. Использование номера не является обязательным – можно указать длину номера 0, и в этом случае платформа отключит механизм нумерации документов. В этом случае разработчик может сам предусмотреть реквизиты для формирования представления документа и для проверки уникальности. Но на практике чаще всего номер не отключается.

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

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

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

Следует учитывать, что у документа должен быть не нулевой код. В случае указания интервала больше года, в результат запроса могут попасть несколько документов с одинаковым номером за разные периоды. Следует либо указывать интервалы в пределах одного календарного года, либо задать документу сплошную непериодическую нумерацию.

// найдём заказ № УТ-000001 за 2021 год

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

Запрос.УстановитьПараметр("ДатаНачала", '20210101');
Запрос.УстановитьПараметр("ДатаОкончания", '20211231235959');
Запрос.УстановитьПараметр("НомерДляПоиска", "УТ-000001");

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

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

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

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

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

// В примере Частное лицо - предопределенный элемент справочника Контрагеты
Запрос.УстановитьПараметр("Покупатель", Справочники.Контрагенты.ЧастноеЛицо);

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

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

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

Начинающие разработчики часто ошибочно пишут, используя передачу параметра с типом Булево.

|ГДЕ
|   Заказ.Проведен = &Проведен"

Запрос.УстановитьПараметр("Проведен", Истина);

Этот код будет корректным с точки зрения синтаксиса и платформы, но это признак недостаточного знания языка запросов и умения составлять текст запросов. В данном случае правильнее просто написать

|ГДЕ
|   Не Заказ.Проведен"
// найдём не проведенные и не помеченные на удаление документы заказов

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

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

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

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

// Переберем все строки документа Заказ с номером УТ-000001
// У документа заказ есть табличная часть Спецификация с колонками
// Товар, Количество, Сумма
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001", '20210101');

Если ЗначениеЗаполнено(НайденныйЗаказ) Тогда
	Для Каждого СтрокаСпецификации Из НайденныйЗаказ.Спецификация Цикл
		Сообщить(СтрШаблон("Товар % 1, количество %2 шт, сумма %3 руб.",
		СтрокаСпецификации.Товар,
		СтрокаСпецификации.Количество,
		СтрокаСпецификации.Сумма));
	КонецЦикла;
КонецЕсли;

Создание и редактирование документов в языке 1С 8

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

// Создадим новый документ Заказ средствами языка 1С

Заказ = Документы.Заказ.СоздатьДокумент();
Заказ.Дата = ТекущаяДата();

//Далее заполним реквизиты шапки
//Здесь - вместо пустой ссылки можно передать реквизит формы, переменную и т.д.
ВыбранныйПокупатель = Справочники.Контрагенты.ПустаяСсылка();
Заказ.Покупатель = ВыбранныйПокупатель;

//Далее - заполняется табличная часть.
СтрокаТЧ = Заказ.Спецификация.Добавить();
СтрокаТЧ.Товар = Товар;
СтрокаТЧ.Количество = 10;
СтрокаТЧ.Сумма = 100;

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

У всех документов в языке 1С есть метод Записать, у которого есть два необязательных параметра: РежимЗаписи и РежимПроведения. РежимПроведения имеет смысл только если мы явным образом вызываем проведение документа.

Вызов метода без параметров равносилен вызову с режимом “Запись”

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

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

Следует иметь в виду, что если у документа свойство Проведение установлено в значение “Запретить”, попытка записать документ с режимом записи “Проведение” приведет к ошибке.

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

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

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

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

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

//Найдем ссылку на заказ, используя объектную модель представления данных
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");

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

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

ПустаяСсылка = Документы.Заказ.ПустаяСсылка();

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

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

ЗаказОбъект.Комментарий = "Произвели какие-то длительные действия по изменению документа";
ЗаказОбъект.Записать();

//а разблокируем при помощи метода объекта
ЗаказОбъект.Разблокировать();

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

Для полноценного ввода на основании другого документа, в дочернем документе должна быть реализована процедура ОбработкаЗаполнения, которая отвечает за алгоритм заполнения. Для связи документа-основания и дочернего документа чаще всего заводится реквизит ДокументОснование. Если связь реализуется один ко многим, как это сделано во многих типовых решениях, то для этого создается табличная часть ДокументыОснования. Ниже рассмотрен простой пример ввода счета на основании заказа.

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

Работа с движениями документа средствами языка 1С

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

// Прочитаем движения документа по регистру ЗаказыКлиентов при помощи запроса
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");

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

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

Чтение и редактирование движений документа в 1С с использованием объектной модели

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

НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");

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

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

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

// в коллекции хранятся наборы записей документа в регистры
// поместим набор записей в переменную
НаборЗаписей = ДвиженияДокумента.ЗаказыКлиентов;

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

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

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

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

// Движения документа Заказ № УТ-000001 теперь отличаются
// от сформированных при проведении.
// Чтобы вернуть исходные движения, документ нужно перепровести

Как отредактировать проведенный документ, не меняя движений

Ситуация, обратная рассмотренной выше – нужно изменить документ, не трогая движения. Такая необходимость иногда возникает, если отчетный период закрыт, движения документов должны быть гарантировано неизменными, но в сами документы необходимо внести изменения.

	НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");
	ЗаказОбъект = НайденныйЗаказ.ПолучитьОбъект();
	ЗаказОбъект.Комментарий = "Отредактируем документ, не трогая движения";
	// В различных конфигурациях при записи объекта может быть реализованы
	// алгоритмы, которые могут вызвать перепроведение.
	// Чаще всего предусмотрен механизм отключения этих алгоритмов при загрузке
	ЗаказОбъект.ОбменДанными.Загрузка = Истина;
	// явным образом укажем, что документ необходимо только записать
	ЗаказОбъект.Записать(РежимЗаписиДокумента.Запись);

Работа с формами документов средствами языка 1С 8

Открыть форму документа по ссылке

// Найдем заказ по номеру с учетом года
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001",'20211231');

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

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

Открыть форму списка документов с отбором по реквизиту

// откроем список заказов, оставив
// только те, что от покупателя ЧастноеЛицо

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Покупатель", Справочники.Контрагенты.ЧастноеЛицо); 
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

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

Открыть форму выбора документа и отследить событие закрытия формы

В клиентском модуле, откуда мы хотим вызвать открытие формы выбора, пишем следующий код:

// Чтобы отследить закрытие формы выбора, нам понадобится обработка оповещения
// Это отдельная экспортная процедура в том модуле, откуда мы вызываем открытие формы
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ОбработкаВыбораДокумента",
        ЭтотОбъект);
 
ОткрытьФорму("Документ.Заказ.ФормаВыбора",,,,,,ОповещениеОЗакрытии);

И добавляем отдельную процедуру для обработки:

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

Как открыть форму нового документа, созданного программно

Бывают ситуации, когда нужно создать документ, заполнить его данными, но не записывая, показать пользователю. Например, для проверки и дальнейшего редактирования. Это можно сделать при помощи следующего кода:

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


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

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

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

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти момент движения относительно точки
  • Как имея тангенс найти сторону
  • Как найти какой ноутбук у меня
  • Как составить построить диаграмму в excel
  • Найти как вырезать снежинки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии