1с найти документ по реквизитам табличной части

Найти документ по реквизиту табличной части

Ø

Я
   ora

06.01.06 — 12:21

Можно ли найти документ по реквизиту его табличной части ?
Мне нужно примерно так:
Если НайтиДокПоРеквТабЧ(НужныйМнеРеквТЧ) = 1 Тогда
       //………..
КонецЕсли;

  

Партнерская программа EFSOL Oblako

   Sasha

1 — 06.01.06 — 12:23

Запрос

   Йожыг паралимпиец

2 — 06.01.06 — 12:25

Можно попробовать выбрать по реквизиту — надо в графу отбора запульнуть

   ora

3 — 06.01.06 — 12:30

(1) А без запроса нет ?
(2) Нет в ЖК ВыбратьПоРеквизиту …

   Йожыг паралимпиец

4 — 06.01.06 — 12:33

Дратуте падалута!
Ну называется по-другому:
ВыбратьПоЗначению()

   ora

5 — 06.01.06 — 12:37

(4) ВыбратьПоЗначению() копает все доки, а это дольше чем еслибы по одному виду.

   Йожыг паралимпиец

6 — 06.01.06 — 12:39

Док = СоздатьОбъект(«Документ.НакладнаяЙожыка»);
Док.ВыбратьПоЗначению(***);

   ora

7 — 06.01.06 — 12:40

(6) Меня ругало за такое. Можт глюки или обшибки …

   Вессемир

8 — 06.01.06 — 12:45

Так что, нужно по любому реквизиту ТЧ найти?
Это так придется все реквизиты отборными делать.
Я бы сделал запрос
ТекстЗапроса=»
|Док=Документ.яяяяя;
|рек=Документ.яяяяя.НужныйРеквизит;
|Условие (рек=РквизитДЛяПориска);
|Группировка Док;»;

   VZ

9 — 06.01.06 — 12:46

(7) Правильно ругало. Жаль, что не матом — ЖКК читать надо. Так можно выбрать либо по общему реквизиту, либо по графе отбора.

   КонецЦикла

10 — 06.01.06 — 12:47

Моно ср-вами 1С++ если надо быстро… но штатно по одному-двум (не думаю, что надо по кол-ву или сумме :)) — см. (6)

   ora

11 — 06.01.06 — 12:57

Пока Ответы > 0 Цикл
(8) Напишу запрос …
Всем спасибо
КонецЦикла;//В конце ;-)

   Андрейка

12 — 06.01.06 — 13:28

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

  

DeiMos

13 — 06.01.06 — 20:24

Обработка «Реестр документов».
Представляет собой универсальный отчет-«простыню» по документу
с выборкой любых данных из документа.
Вывод на печать выбранных реквизитов документа.
Сортировка по любому реквизиту.
Выбор проведенных или непроведенных документов.
Автор: Андрей Федин andrey@fedin.ru
p/s При обнаружении ошибок в программе,
либо же при наличие пожеланий в доработке программы пишите автору.
Доработка отчета — включение в отчет табличной части документов,
отбор по фирме и автору
сделана Шапкиным Михаилом michail_shapkin(.at.)nuron.uz
Примечание:
1.В процедуре ПриВыбореДокумента()
для всех общих реквизитов документов включены строки вида:
Реквизиты.ДобавитьЗначение(«ДляДругФирмы», «Для Других Фирм»);
ПоляСортировки.ДобавитьЗначение(«ДляДругФирмы», «Для Других Фирм»);
где ДляДругФирмы — общий реквизит документа.
Удалите строки для тех общих реквизитов, которых нет в вашей
конфигурации, и добавьте те общие реквизиты, которые здесь отсутствуют.
2.При работе используйте кнопки «Сохранить текущую настройку» и
«выбрать и открыть сохраненную ранее настройку».
Не используйте галочку «сохранять автоматически».
3.Изменить название реквизита в печатной форме
можно двойным кликом по реквизиту в форме диалога.
Copyright c 2003 Mickle, Nuron Inc. All rights reserved.

TurboConf — расширение возможностей Конфигуратора 1С

 +9 

   

Распечатать

Найти строку в табличной части документа

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

Код 1C v 8.2 УП

 &НаСервере
Процедура НайтиТовар(СправочникНоменклатураСсылка)

Перем Отбор, НайденноеЗначение, Сч;

Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СправочникНоменклатураСсылка);
НайденноеЗначение = Объект["ТЧНоменклатура"].НайтиСтроки(Отбор);

Если НайденноеЗначение.Количество() > 0 Тогда

Сч = 1;
Пока НайденноеЗначение.Количество() >= Сч Цикл
Сообщить(НайденноеЗначение[0].Наименование);
Сч = Сч + 1;
КонецЦикла;

КонецЕсли;

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


Код 1C v 8.х

  // найти строку в ТЧ Документа
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СправочникНоменклатураСсылка);
НайденноеЗначение = ТЧНоменклатура.НайтиСтроки(Отбор);

// Необходимо найти МассивСтрок, состоящий из строк табличной части документа по 2 значениям.
СтруктураДляПоиска = Новый Структура;
структураДляПоиска.Вставить("Артикул",Артикул);
структураДляПоиска.Вставить("КодПартии",СтруктураПараметров.КодПартии);

МассивСтрок = ДокументДляДополнения.Товары.НайтиСтроки(структураДляПоиска);


Выгружаем колонку

Код 1C v 7.x

 ВыгрузитьТабличнуюЧасть("Товар")

Далее через НайтиЗначение ищем необходимую строку

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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С. Рассматриваются приемы работы с объектной моделью – создание, редактирование, удаление документов, а также типовые запросы для выборки документов по различным условиям. Для удобства пользуйтесь оглавлением.

Содержание

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

Документы – краеугольный камень в построении большинства учетных систем средствами платформы 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');

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Найти строку по заданным параметрам

Для решения задачи поиска строк в ТЧ будем использовать функцию НайтиСтроки.

Синтаксис: НайтиСтроки(<ПараметрыОтбора>)
Параметры: <ПараметрыОтбора> (обязательный)
Тип: Структура. Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры – искомое значение.
Возвращаемое значение: Массив из строк табличной части, соответствующих заданному условию поиска.
Замечание! Массив хранит ссылки на строки табличной части, то есть при изменении строки в табличной части, значение в массиве тоже будет изменено.
Описание: Осуществляет поиск строк табличной части, соответствующих заданному условию поиска.

Первый вариант, который встречается в работе найти строки с определенным значением в колонке.

Найти все строки ТЧ с определенным значением задачи.

  1. Создадим структуру отбор и установим значение задачи
  2. Применим функцию НайтиСтроки к нужной табличной части
  3. В переменной МассивНайденныхСтрок будут ссылки на строки таблицы которые содержат нужную нам задачу
Отбор = Новый Структура("Задача",ДокументСсылкаЗадача);
МассивНайденныхСтрок = ТЧПодзадачи.НайтиСтроки(Отбор);

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

Найти все строки ТЧ с определенным значением номенклатуры и количества

  1. Создаем структуру для отбора
  2. Устанавливаем два параметра поиска (если параметров больше устанавливаем столько, сколько надо)
  3. Ищем в таблице нужные строки
  4. Получаем переменную МассивНайденныхСтрок с нужными данными
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура",СправочникНоменклатураСсылка);
Отбор.Вставить("Количество",ИскомоеКоличество);

МассивНайденныхСтрок = РеализацияТовароУслуг.Товары.НайтиСтроки(Отбор);   

В примере номер три реализуем процедуру которая сообщит все цены номенклатуры в определенном документе.

Реализовать процедуру которая сообщит цену на товар в поступлениях, реализациях и счетах на выбор пользователя.

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

  1. Создаем отбор и устанавливаем значения поиска
  2. Ищем в табличной части
  3. Сообщаем все цены которые нашли
&НаСервере
Процедура НайтиЦеныНаТовар(Документ,СправочникНоменклатураСсылка)
	Отбор = Новый Структура("Номенклатура", СправочникНоменклатураСсылка);
	МассивНайденныхСтрок = Документ["Товары"].НайтиСтроки(Отбор);
	Для Каждого ЭлМас Из  МассивНайденныхСтрок Цикл
		Сообщить(ЭлМас.Цена);
	КонецЦикла;
КонецПроцедуры   

В 1с существует метод Найти(), это устаревший метод для его не стоит использовать.

Дополнительные материалы по теме:

  1. Заметки и учебные примеры по программированию у меня на сайте ищите – тут
  2. Интересная статья про НайтиСтроки – тут

Как выбрать и упорядочить документы за период в 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;

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

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

You have no rights to post comments

На чтение 5 мин. Просмотров 671 Опубликовано 15.12.2019

//Корректировать строку табличной части документа
//»ОС» — наименование табличной части
Тч = Док . ОС ;
Тч[ 0 ] . НалоговаяГруппаОС = Справочники . НалоговыеГруппы . НайтиПоНаименованию ( «Четвертая (с 2004 г)» );
Док . Записать ( РежимЗаписиДокумента . Проведение );

//——————————————————————
//Поиск в табличной части документа
//»Платежи» — наименование табличной части
Сообщить ( Док . Платежи . Найти ( ТоЧтоНужноНайти , «РеквизитВТабЧастиГдеИскатьЗначение» )[ «РеквизитВТабЧастиОткудаВзятьЗначение» ]);

//——————————————————————
//Cделать текущей строку табличной части формы документа
//»Выписки» — наименование табличной части
ЗаписьВыписка = ДокБанковскаяВыписка . Выписки . Добавить ();
ЗаписьВыписка . Реквизит1 = «Реквизит1» ;
ЗаписьВыписка . Реквизит2 = «Реквизит2» ;

ФормаВыписка = ДокБанковскаяВыписка . ПолучитьФорму ( «ФормаДокумента» );
ФормаВыписка . ЭлементыФормы . Выписки . ТекущаяСтрока = ЗаписьВыписка ;
ФормаВыписка . Открыть ();

//——————————————————————
//Удалить записи из табличной части документа с помощью структуры
Отбор = Новый Структура ;
Отбор . Вставить ( «КодОбъекта» , ЗначениеКодОбъекта );

Документ = Документы . ПриходнаяНакладная . НайтиПоНаименованию ( «Наименование» ). ПолучитьОбъект ();

//Удаляем записи табличной части
ЗаписиТабЧасти = Документ [ «НазваниеТабЧасти» ]. НайтиСтроки ( Отбор );
Для Каждого ЗаписьТабЧасти Из ЗаписиТабЧасти Цикл
Документ [ «НазваниеТабЧасти» ]. Удалить ( ЗаписьТабЧасти );
КонецЦикла;

//——————————————————————
//Удалить строки (записи) из табличной части документа в цикле (при переборе)
Док = ДокБанковскаяВыписка . ПолучитьОбъект ();
КоличествоЗаписей = Док . Выписки . Количество ();
КоличествоОборотов = 0 ;
Для ъ = 0 По КоличествоЗаписей — 1 Цикл
КоличествоОборотов = КоличествоОборотов + 1 ;

Если Док . Выписки [ ъ ]. ИмяПоля = Истина Тогда
Док . Выписки . Удалить ( Док . Выписки [ ъ ]);
ъ = ъ — 1 ;
КонецЕсли;

Если КоличествоОборотов = КоличествоЗаписей Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Док . Записать ();

Осуществляет поиск всех строк таблицы значений, удовлетворяющих заданным условиям поиска.

Содержание

  1. Синтаксис
  2. Параметры
  3. Возвращаемое значение
  4. Описание
  5. Доступность
  6. Пример использования
  7. Прием №4: Поиск в текущей колонке сразу после начала набора текста.
  8. Прием №5: Ввод в поле ввода по строке.
  9. Прием №6: Суммирование выделенных ячеек в отчетах.
  10. Прием №7: Сохраняйте любые печатные формы в любом удобном формате.
  11. Прием №8: Групповая печать документов.
  12. Прием №9: Печать журнала или табличной части документа.

Синтаксис

Метод НайтиСтроки() имеет следующий синтаксис:

А также альтернативный англоязычный синтаксис:

Параметры

Описание параметров метода НайтиСтроки() :

Имя параметра Тип Описание
ПараметрыОтбора Структура Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры — искомое значение.
Жирным шрифтом выделены обязательные параметры

Возвращаемое значение

Массив
Массив найденных строк таблицы значений, соответствующих условиям поиска.

Описание

Метод НайтиСтроки() осуществляет поиск строк таблицы значений, удовлетворяющих заданным условиям поиска. В отличие от метода ТаблицаЗначений.Найти(), возвращает все найденные строки.

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Пример использования

Пример кода с использованием метода НайтиСтроки() :

Этой статьей я продолжаю серию заметок об эффективных приемах работы в 1С:Бухгалтерия 8.3. Рассказываю о хитростях, которые мало кто знает и ещё меньше людей используют в своей работе. Приемы, о которых пойдет речь, способны существенно сэкономить время и повысить вашу квалификацию как специалиста. Первая часть доступна здесь.
п

Прием №4: Поиск в текущей колонке сразу после начала набора текста.

Как вы ещё не пользуетесь этой потрясающей возможностью? В любом журнале (будь-то справочник или документы) выделите любую строчку в любом столбце и просто начинайте набирать текст.

Система автоматически будет отбирать строки, в которых содержится вводимое вами значение в одном из столбцов:

Если нужно отменить фильтр — нажмите кнопку Esc на клавиатуре или на крестик в поле поиска:

Но что, если нам нужно искать не во всех колонках, а только в конкретной?

Для поиска в текущей (выделенной) колонке используйте комбинацию Alt + F или пункт меню «Ещё»->»Расширенный поиск»:

Для мгновенного отбора (без отображения диалогового окна) по текущей колонке и по выделенному в ней значению используйте комбинацию Ctrl + Alt + F или пункт меню «Ещё»->»Найти. «.

Например, давайте отберём все документы в номере которых встречается цифра 8. Для этого выделим столбец «Номер» в любой строке и нажмём Alt + F.

В открывшемся окне наберём цифру 8 и нажмём «Найти»:

Отлично, в списке остались документы в номере которых (в любой позиции) содержится цифра 8:

Для отмены отбора нажмём комбинацию Ctrl + Q или удалим отбор с верхней панели (крестик):

Внимание! Если поиск не срабатывает (получается пустой отбор) — вероятно у вас включён полнотекстовый поиск и не обновлён его индекс.

Полнотекстовый поиск настраивается в разделе «Администрирование» пункт «Поддержка и обслуживание»:

Далее регламентные операции и уже здесь или отключаем полнотекстовый поиск или обновляем его индекс (пункт «Настроить» кнопка «Обновить индекс»):

Прием №5: Ввод в поле ввода по строке.

Пусть вам требуется забить поле контрагент в документе «Поступление товаров и услуг» и вы знаете, что контрагент называется как-то на «аэро».

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

И так можно в любых полях!

Прием №6: Суммирование выделенных ячеек в отчетах.

Просто выделяйте нужные ячейки мышкой — сумма автоматически отобразится в поле указанном на рисунке. А если нужно выделить ячейки не находящиеся рядом — используйте клавишу CTRL. Зажмите её и выделяйте нужные ячейки в отчете, чтобы получить их сумму.

Прием №7: Сохраняйте любые печатные формы в любом удобном формате.

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

Теперь выберите имя и формат для документа. Это может быть excel, word, pdf, html и многие другие популярные форматы.

Прием №8: Групповая печать документов.

Прием №9: Печать журнала или табличной части документа.

Продолжение здесь (ч. 3).

Мы молодцы, на этом всё

Кстати, подписывайтесь на новые уроки.

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Понравилась статья? Поделить с друзьями:
  • Акционерное общество ивгортеплоэнерго реквизиты
  • Азбука вкуса боровское шоссе дом 56 часы работы
  • Авито республика алтай продажа готового бизнеса
  • 1с отбор документа по реквизиту табличной части
  • Акционерное общество нефтяная компания дулисьма