Как найти последний номер документа

Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

1

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

09.11.2012, 10:09. Показов 20301. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте.
Есть документ Реализация. В нем есть реквизит АктПередачи (тип: булево).
Нужно, чтобы при записи документа находился последний номер документа, в котором АктПередачи = Истина и новый документ был с номером + 1.
Вот моя процедура. Как правильно записать это: Реализация = Документы.РеализацияТоваровУслуг.Выбрать( , «Номер»);

1C
1
2
3
4
5
6
7
8
Процедура Реализация()
 
Если Объект.АктПередачи = Истина Тогда
Реализация = Документы.РеализацияТоваровУслуг.Выбрать( , "Номер");
Объект.Номер = Реализация + 1;
КонецЕсли;
 
КонецПроцедуры



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

09.11.2012, 10:09

Ответы с готовыми решениями:

Номер документа
У меня такой вопрос! Как мне сделать, чтоб при формировании документа заказа покупателя,…

Номер документа
Всем доброго времени суток!
Если не сложно — помогите разобраться с механизмом работы метода…

Номер документа
У меня такой вопрос! Как мне сделать, чтоб при формировании документа заказа покупателя,…

УРБД. Номер документа
Центральная база — все нормально, делаем новый документ, создается номер типа ХХ-0000123….

10

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

09.11.2012, 10:24

2

ВЫБРАТЬ ПЕРВЫЕ 1 Номер Из Документ.реализалицияТУ СОРТИРОВАТЬ ПО Номер УБЫВ



1



Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

09.11.2012, 17:14

 [ТС]

3

Спасибо!
Сделала такой запрос, но номер не увеличивает. У него ведь тип строка…

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
Если Объект.АктПриемаПередачи = Истина Тогда
 
Запрос = Новый Запрос();
Запрос.Текст = 
"ВЫБРАТЬ
| МАКСИМУМ(РеализацияТоваровУслуг.Номер) КАК Номер
|ИЗ
|    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг";
  
Результат = Запрос.Выполнить().Выбрать();
Объект.Номер = Результат.Номер + 1;
 
КонецЕсли;

Добавлено через 5 минут
Строку в номер так переводила:

1C
1
2
Строка = Объект.Номер;
Число = Число(Строка)

Но оно не перевело.



0



Модератор

Эксперт 1С

3721 / 2916 / 574

Регистрация: 10.03.2011

Сообщений: 11,485

Записей в блоге: 1

09.11.2012, 21:45

4

Цитата
Сообщение от Titanum
Посмотреть сообщение

Но оно не перевело.

А что написало???



1



1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

09.11.2012, 21:46

 [ТС]

5

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



0



Dethmontt

Модератор

Эксперт 1С

3721 / 2916 / 574

Регистрация: 10.03.2011

Сообщений: 11,485

Записей в блоге: 1

09.11.2012, 22:10

6

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Если Объект.АктПриемаПередачи = Истина Тогда
 
Запрос = Новый Запрос();
Запрос.Текст = 
"ВЫБРАТЬ
| МАКСИМУМ(РеализацияТоваровУслуг.Номер) КАК Номер
|ИЗ
|    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг";
  
Результат = Запрос.Выполнить().Выбрать();
Результат.Следующий();
Если ТипЗнч(Результат.Номер) = Тип("Число") Тогда
    Объект.Номер = Результат.Номер + 1; //Это если номер имеет тип ЧИСЛО
ИначеЕсли ТипЗнч(Результат.Номер) = Тип("Строка") Тогда
    Длинна = Объект.Ссылка.Метаданные().Реквизиты.Номер.Тип.КвалификаторыСтроки.Длина;
    Объект.Номер = Строка(Формат(ВернутьНомерЧислом(Результат.Номер)+1,"ЧЦ="+Длинна+"; ЧРГ=''; ЧВН="));    
Иначе
    Сообщить(ТипЗнч(Результат.Номер));
КонецЕсли;
 
Функция ВернутьНомерЧислом(Знач ПодСтрока) 
    Сч=2;
    Пока Истина Цикл
        Если ПустаяСтрока(ПодСтрока) тогда
            Возврат 0;
        КонецЕсли;
        Попытка
            Число = Число(ПодСтрока);
            Возврат Число;
        Исключение
            ПодСтрока = Сред(ПодСтрока,Сч);
            Сч = Сч+1;
        КонецПопытки;
    КонецЦикла
 
КонецФункции



1



1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

09.11.2012, 22:13

 [ТС]

7

Оо, спасибо большое!



0



Модератор

Эксперт 1С

3721 / 2916 / 574

Регистрация: 10.03.2011

Сообщений: 11,485

Записей в блоге: 1

09.11.2012, 22:14

8

Работать не будет 100% если ЭТО первый документ =))



1



1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

09.11.2012, 22:18

 [ТС]

9

Ничего … первый документ есть.



0



Dethmontt

Модератор

Эксперт 1С

3721 / 2916 / 574

Регистрация: 10.03.2011

Сообщений: 11,485

Записей в блоге: 1

09.11.2012, 22:23

10

Там скорее всего вместо РЕКВИЗИТЫ нужно поставить СтандартныеРеквизиты
Тут:

1C
1
Метаданные().Реквизиты



1



1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

09.11.2012, 22:27

 [ТС]

11

Хорошо, позже на деле испытаю. Спасибо Вам!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

09.11.2012, 22:27

Помогаю со студенческими работами здесь

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

Как сократить номер документа в печатной форме ЗУП 2.5
Как сократить номер документа в печатной форме ЗУП 2.5, при том что форма внешняя.

Как получить последний номер документа?
Необходимо в документе проставлять его номер, документы могут в теории удаляться, то есть номер…

Получить последний номер каталога
Приветствую.
Есть каталог, например, SomeFolder, в нем есть несколько подкаталогов, например,…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

11

   Vladal

5 — 10.02.11 — 17:50

Рабочий пример — номер документа [префикс-число/месяц/ПорядковыйНомер]

// ВЛ — 2011-01-10 — Возвращает ожидаемый новый номер документов НаХранение
// с учетом префикса филиала текущего пользователя
Функция СформироватьНовыйНомерХР(ДатаДокумента, Самовывоз = Ложь)

       Перем Филиал, КодФилиала, ПрефиксФилиала, НовыйНомерДокумента;
   // ВЛ — 2011-01-06 — Нумерация документов внутри кода филиала
   // Формируем строку в 4 символа, т.к. получаются неоднозначности по подстроке
   // «ХРУ» и «ХРУ1». А когда «ХРУ-» и «ХРУ1» — всё однозначно.
   // Условно самовывоз с 50-го номера
   Филиал = ПараметрыСеанса.ТекущийПользователь.Родитель.Филиал;
   КодФилиала = ?(Филиал = Справочники.ФилиалыФирмы.Купянск, «-«, Филиал.Код);
   ПрефиксФилиала = Лев(ПрефиксНомеров + КодФилиала, 4);

       Запрос = Новый Запрос;
   Запрос.Текст =
   «ВЫБРАТЬ ПЕРВЫЕ 1
   |    РеализацияТоваровУслуг.НомерСчетаВетСвидедельства КАК НомерСчета,
   |    РеализацияТоваровУслуг.Ссылка
   |ИЗ
   |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |ГДЕ
   |    (ВЫРАЗИТЬ(РеализацияТоваровУслуг.НомерСчетаВетСвидедельства КАК СТРОКА(4))) = &ПрефиксФилиала
   |    И НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)
   |    И РеализацияТоваровУслуг.Самовывоз = &Самовывоз
   // ВЛ — 2011-01-14 — |    И РеализацияТоваровУслуг.Проведен
   |
   |УПОРЯДОЧИТЬ ПО
   |    НомерСчета УБЫВ»;

       Запрос.УстановитьПараметр(«ПрефиксФилиала», ПрефиксФилиала);
   Запрос.УстановитьПараметр(«Самовывоз», Самовывоз);
   Запрос.УстановитьПараметр(«Дата», Дата);

       РезультатЗапроса = Запрос.Выполнить().Выгрузить();
   НайденоСтрок = РезультатЗапроса.Количество();

       // Если в выборке уже есть номер, его распарсим и добавим 1, иначе присвоим новый
   Если НайденоСтрок > 0 Тогда

               // Парсим номер документа:
       // Условно откусим 4 символа справа, преобразуем в число и добавим 1
       СтрокаДляРазбора    = Прав(РезультатЗапроса[0].НомерСчета, 4);
       ПозицияСлэша        = Найти(СтрокаДляРазбора, «/»);
       СтрокаДляРазбора    = Прав(СтрокаДляРазбора, 4 — ПозицияСлэша);
       РезультатПарсинга   = Число(СтрокаДляРазбора);
       НовыйНомерДокумента = РезультатПарсинга + 1;

           Иначе

               НовыйНомерДокумента = ?(Самовывоз, 50, 1);

           КонецЕсли;

       // на случай длины более 2 знаков
   ДлинаНомераДокумента = СтрДлина(НовыйНомерДокумента);
   ДлинаНомераДокумента = ?(ДлинаНомераДокумента = 1, 2, ДлинаНомераДокумента);

       НовыйНомерДокумента = ПрефиксФилиала
                       + ?(Филиал = Справочники.ФилиалыФирмы.Купянск, «», «-«)  // Один дефис в префиксе
                       + День(ДатаДокумента) + «/» + Месяц(ДатаДокумента)
                       + «/» + Формат(НовыйНомерДокумента, «ЧЦ=»+ДлинаНомераДокумента+»;ЧВН=;ЧГ=0″);

       Возврат НовыйНомерДокумента;

    КонецФункции // СформироватьНовыйНомерХР()

Содержание:

1.       Получение последних документов в 1С

2.       Запрос с временной таблицей

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

1.      Получение последних документов в 1С

У многих разработчиков в 1С часто возникает вопрос: как получать последние (либо первые) документы из конкретной выборки? Данную задачу можно решить не одним, но несколькими способами.

Рассмотрим пример. Пусть есть некоторая первоначальная база 1С:Управление торговлей, редакция 11, из которой необходимо получить последнюю документацию по номенклатурному приходу по специальному регистру «ТоварыНаСкладе». Последним документом в этом контексте имеется ввиду тот документ, который имеет максимальную дату, а именно: последний документ, в котором работал пользователь системы 1С.

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

Далее представлены примеры запросов:

Рис. 1 Запрос для поиска последнего документа в 1С

Результат будет выведен в виде следующей таблицы с последними сохраненными документами – номенклатурой по регистраторам:

Рис. 2 Таблица с последними сохраненными документами – номенклатура по регистраторам

В таком случае сортировка по умолчанию будет происходить без учета даты документации – учитывается только персональный идентификатор. Таким образом документация, которая была зарегистрирована позже некоторого времени в приходной ордер ЦУ-33, будет в самом начале нашей выборки. Рассмотрим вариант, когда сортировки по порядку не будет:

Рис. 3 Таблица без сортировки по порядку последних документов в 1С

Если необходимо выбрать последние открытые документы в списке с номенклатурой, «ВЫБРАТЬ ПЕРВЫЕ» работать не будет. В таком случае воспользуемся функцией «МАКСИМУМ», как показано в примере запроса ниже:

Рис. 4 Запрос для поиска последних открытых документов

А результат данного запроса будет следующим:

Рис. 5 Результат поиска последних открытых документов

В данном случае конструкция «МАКСИМУМ» разбивает избранную выборку по «GUID» объекта. Данным способом можно воспользоваться в 1С 8 УТ 11 в случае, когда необходимо получить последний сохраненный документ, опираясь на его дату. Так мы получаем список с номенклатурой и, при помощи цикла для всех позиций по отдельности, последний документ в 1С 8 «Управление торговлей» 11. Но данный способ занимает довольно много времени и уменьшает производительность.  

2. Запрос с временной таблицей

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

Рис. 6 Запрос с временной таблицей

Результат будет следующим:

Рис. 7 Результат запроса с временной таблицей

Специалист компании «Кодерлайн»

Айдар Фархутдинов

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

    подскажите, как можно получить последний номер документа (например ПриемРаботника).

    Хочу вводить свои номера, автонумерация отключена.


  2. AlexFF

    Offline

    AlexFF
    Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26

    ВЫБРАТЬ
    МАКСИМУМ(ЗаказПоставщику.Номер) КАК Номер
    ИЗ
    Документ.ЗаказПоставщику КАК ЗаказПоставщику
    

    Будет работать неправильно если есть разные префиксы.
    Тогда нужно еще организацию анализировать

  3. Спасибо, думал что просто должно быть, но чтоб так просто… )))


  4. Эмин

    Offline

    Эмин
    Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    29

    Ну конечно не все так просто :)
    Если у вас нумерация идет циклически (с периодичностью в год, например), то такой запрос вам «очень эффектно» выдаст последний номер документа прошлого года, например :)

    Так что ставьте условие в запрос на год (дата документа между … …)!!!


  5. AlexFF

    Offline

    AlexFF
    Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:
  • Как исправить ошибку 2503 при установке эпик геймс
  • Как найти свою татуировку
  • Как найти прямую трансляцию футбола
  • Как составить план сказки храбрый утенок
  • Как найти ответы на сайте liveworksheets