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

Поиск документов по реквизитам

Я
   kotokent

28.01.14 — 07:37

В конфигурации 1С Управлений торговлей редакции 10.3 создать новую общую форму и разместить на ней реквизиты «Ответственный» и «Комментарий» по кнопке записать система ищет все документы с типом «реализация товаров и услуг» и если в документе значение реквизита «ответственный» или «комментарий» сообщать номер документа.

Я подумал что будет что то типо этого:

Процедура Записать(Команда)

    Документы.РеализацияТоваровУслуг.НайтиПоРеквизиту(Ответственный, «*»);

    Документы.РеализацияТоваровУслуг.НайтиПоРеквизиту(Комментарий, «*»);

    Сообщить(НомерДокумента);

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

Но что то никак. Помогите разобраться!!!

а и еще сделал форму: http://s020.radikal.ru/i721/1401/67/df00a0409849.png

  

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

   Wobland

1 — 28.01.14 — 07:43

советую переформулировать задачу на русском языке. что будет при Документы.РеализацияТоваровУслуг.Выбрать()?

   jsmith82

2 — 28.01.14 — 07:45

ужас

   ZaprosMan

3 — 28.01.14 — 07:47

Нужно проверить уникальность? Найти документы с указанным ответственным или комментарием и сообщить их номера?

   Wobland

4 — 28.01.14 — 07:48

а форма ещё и управляемая..

   kotokent

5 — 28.01.14 — 07:48

(1) выбрать все документы РаелизацияТоваровУслуг

   kotokent

6 — 28.01.14 — 07:49

(3) да, или с 1-ым ответственным или с комментарием

   kotokent

7 — 28.01.14 — 07:49

(4) конечно

   Wobland

8 — 28.01.14 — 07:51

(7) а конфигурация работает в обычном, я уверен

   kotokent

9 — 28.01.14 — 07:53

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

   Wobland

10 — 28.01.14 — 07:56

>Найти документы с указанным ответственным или комментарием и сообщить их номера

выбрать док.номер из документ.реализация как док где док.ответственный=&ответственный или выразить(док.комментарий как строка (1024))=&комментарий

полегчало?

   ZaprosMan

11 — 28.01.14 — 07:59

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

   kotokent

12 — 28.01.14 — 08:00

(10)

РеквизитОтветственный = Элементы.Ответственный;

    ТекДокумент = Документы.РеализацияТоваровУслуг;

    РезультатПоискаПоРеквизиту = ТекДокумент.НайтиПоРеквизиту(«Ответственный»,РеквизитОтветственный);

    Если РезультатПоискаПоРеквизиту = ТекДокумент.ПустаяСсылка() Тогда

        Сообщить(РезультатПоискаПоРеквизиту.Наименование);

    Иначе

        Сообщить(«Не найден»);

    КонецЕсли;

вот так попробовал но он пишет ошибку:

{ОбщаяФорма.РеализацияТоваровИУслуг.Форма(4)}: Поле объекта не обнаружено (Ответственный)

    РеквизитОтветственный = Элементы.Ответственный;

   kotokent

13 — 28.01.14 — 08:01

(11) у меня база не серверная

   Wobland

14 — 28.01.14 — 08:03

Элементы.Ответственный — это поле ввода такое (которого ещё и нет), а не то, что в нём понаписано

   kotokent

15 — 28.01.14 — 08:05

(14) блин, я понял это, как его написать то, если на форме простое поле ввода стоит

   Wobland

16 — 28.01.14 — 08:07

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

   kotokent

17 — 28.01.14 — 08:08

(16) ну а тут как будто сложно его считать с поля

   George Wheels

18 — 28.01.14 — 08:09

(17) Реквизит и элемент это разные понятия в УФ.

И зачем тебе управляемая форма в обычном приложении.

   Wobland

19 — 28.01.14 — 08:10

не надо его читать с поля, надо обратиться к реквизиту

   kotokent

20 — 28.01.14 — 08:11

(16) он мне ошибку выдает что поле объекта не обнаружено

http://s020.radikal.ru/i706/1401/43/9bdf39a250fd.png

   Wobland

21 — 28.01.14 — 08:12

   kotokent

22 — 28.01.14 — 08:13

(21) да я уже по разному пробовал

   Wobland

23 — 28.01.14 — 08:13

(22) по-хорошему не хочешь?

   kotokent

24 — 28.01.14 — 08:16

(23)Хочу

уже и так написал

РеквизитОтветственный = Элементы.ПолеОтветственный

   George Wheels

25 — 28.01.14 — 08:20

(24) А какой тип у Элементы.ПолеОтветственный?

   kotokent

26 — 28.01.14 — 08:21

(25) отладчик говорит что «Поле формы»

   George Wheels

27 — 28.01.14 — 08:24

(26) У поля формы есть свойства. Например «ПутьКДанным».

   George Wheels

28 — 28.01.14 — 08:26

(26) И всё-таки повторюсь. Брось этот геморрой с УФ в обычном приложении. В данном случае нет никакой необходимости их использовать.

   kotokent

29 — 28.01.14 — 08:27

   Wobland

30 — 28.01.14 — 08:27

мы тут до вечер будем новую форму создавать в текстовом режиме

   kotokent

31 — 28.01.14 — 08:28

(28) я с обычной не умею

   Wobland

32 — 28.01.14 — 08:29

(31) а с управляемой в полный рост?

   kotokent

33 — 28.01.14 — 08:30

(32) ну более менее

   George Wheels

34 — 28.01.14 — 08:32

(29) Не надо брать из элемента ПутьКДанным из элемента. Просто посмотри, что там находится и потом обращайся не к элементу а к тому реквизиту, который там прописан.

И не забывай про &НаСервере, &НаКлиенте.

   kotokent

35 — 28.01.14 — 08:35

(34) Это как?

   Wobland

36 — 28.01.14 — 08:36

а нет ли какого реквизита формы про ответственного?

   George Wheels

37 — 28.01.14 — 08:37

(35) В поле ПутьКДанным должен быть указан реквизит формы. Вот с ним и играйся.

   kotokent

38 — 28.01.14 — 08:37

я уже создал обычную форму

   George Wheels

39 — 28.01.14 — 08:38

(38) Вот теперь будет всё намного проще.

   Wobland

40 — 28.01.14 — 08:40

(38) 46 минут. неплохой результат

   kotokent

41 — 28.01.14 — 08:41

(40) ну а теперь то как обращаться к этому полю и почему намного проще будет

   Wobland

42 — 28.01.14 — 08:46

(41) может, лучше к реквизиту?

   МимохожийОднако

43 — 28.01.14 — 08:47

Осталось убедить использовать запрос.

   Wobland

44 — 28.01.14 — 08:47

(43) даже уже текст есть ;)

   kotokent

45 — 28.01.14 — 08:54

(44) блин, как к полю обратьться?

   Wobland

46 — 28.01.14 — 08:55

   kotokent

47 — 28.01.14 — 08:57

(46) да, верно, к реквизиту

   kotokent

48 — 28.01.14 — 08:57

(46) как?

   Wobland

49 — 28.01.14 — 08:58

(48) УважаемыйРеквизит

   Wobland

50 — 28.01.14 — 08:59

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

   MSII

51 — 28.01.14 — 08:59

(48) У тебя реквизит чего? Формы? В модуле формы можешь обратиться к нему по просто по имени, он не обидится.

   kotokent

52 — 28.01.14 — 08:59

(51) Ответственный?

   MSII

53 — 28.01.14 — 09:00

(52) Если терзают сомнения, я бы заглянул в конфигуратор и посмотрел, как называется реквизит.

   kotokent

54 — 28.01.14 — 09:00

он мне сейчас страшную ошибку выдал «ожидается выражение (pos=47)»

   kotokent

55 — 28.01.14 — 09:02

(51) обработчик увидел что я написал, крутяк… теперь надо новера чтобы сообщил!??!

   Wobland

56 — 28.01.14 — 09:03

(55) как насчёт запроса?

   kotokent

57 — 28.01.14 — 09:05

(56) а без него ни как?

РеквизитОтветственный = Ответственный;

    ТекДокумент = Документы.РеализацияТоваровУслуг;

    РезультатПоискаПоРеквизиту = ТекДокумент.НайтиПоРеквизиту(«Ответственный»,РеквизитОтветственный);

    Если РезультатПоискаПоРеквизиту = ТекДокумент.ПустаяСсылка() Тогда

        Сообщить(Документы.РеализацияТоваровУслуг.НайтиПоНомеру());

    Иначе

        Сообщить(«Не найден»);

    КонецЕсли;

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

   kotokent

58 — 28.01.14 — 09:05

(56) после первого «если», нельзя сообщить просто номер документа в котором тот или иной ответственный?

   Wobland

59 — 28.01.14 — 09:06

(57) как. но получится некрасиво. что это за буквы?

   kotokent

60 — 28.01.14 — 09:08

   Любопытная

61 — 28.01.14 — 09:08

Сообщить(Документы.РеализацияТоваровУслуг.НайтиПоНомеру()) — что это?

   Wobland

62 — 28.01.14 — 09:09

> Найти документы с указанным ответственным или комментарием и сообщить их номера

попытка поиска засчитана (комментарий не рассматриваем), попытка сообщить — нет

   MSII

63 — 28.01.14 — 09:11

(61) В этой строке так и сквозит отчаяние и жалобная просьба к платформе сделать хоть что-нибудь.

   Wobland

64 — 28.01.14 — 09:11

(63) а она ему: хлобысь по рукам, первый параметр не указан

   Любопытная

65 — 28.01.14 — 09:11

(62) НайтиПоРеквизиту найдет 1 документ, а не документы.

   kotokent

66 — 28.01.14 — 09:11

(61) это я накидал, думал пройдет

(62) мне кажется что процедура не работает как надо, он мне постоянно по одному если ходит, если даже нет такого ответственного

   Wobland

67 — 28.01.14 — 09:12

(65) поэтому засчитана только жалкая попытка

   Wobland

68 — 28.01.14 — 09:13

(66) нажми ктрл+ф1, изучи НайтиПоРеквизиту(), сделай выводы

   Любопытная

69 — 28.01.14 — 09:13

(66) попробуй использовать метод Выбрать()

   Любопытная

70 — 28.01.14 — 09:13

Если реквизит Ответственный индексируется конечно

   George Wheels

71 — 28.01.14 — 09:13

Запрос, запрос и ещё раз запрос. Как говорил великий Ленин.

   Wobland

72 — 28.01.14 — 09:14

(69) НЕЕТ!! там отбор, а это структура

   Любопытная

73 — 28.01.14 — 09:15

(72) и что? (71) Ленин такого не говорил. И даже про «учиться…» сказал не Ленин, а вовсе Белинский

   kotokent

74 — 28.01.14 — 09:15

запутался я

   George Wheels

75 — 28.01.14 — 09:15

(73) Я плохо учил заветы Ильича:)

   Wobland

76 — 28.01.14 — 09:15

(73) так мы снова до (200) дотянем

   George Wheels

77 — 28.01.14 — 09:16

Деньги ещё никто не просил?

   kotokent

78 — 28.01.14 — 09:17

РезультатПоискаПоРеквизиту = ТекДокумент.НайтиПоРеквизиту(«Ответственный»,РеквизитОтветственный);

здесь ошибка

   Wobland

79 — 28.01.14 — 09:17

(74) а неплохо было бы сказать платформе: выбери мне номера документов, у которых ответственный вот этот, а я потом переберу результат и сообщу это всё юзеру?

   Wobland

80 — 28.01.14 — 09:17

(78) как работает НайтиПоРеквизиту?

   Любопытная

81 — 28.01.14 — 09:17

(76) да брось, там все просто и в СП написано. Это будет первый шаг к запросам.

Хотя запросы, имхо, проще. Там конструктор есть, вообще все мышкой можно сделать))

   kotokent

82 — 28.01.14 — 09:18

(80) он только 1 док найдет

   Любопытная

83 — 28.01.14 — 09:18

(78)какая?

   kotokent

84 — 28.01.14 — 09:19

(83)он не ищет вообще документы

   Любопытная

85 — 28.01.14 — 09:19

(84) ТекДокумент — а это что?

   Wobland

86 — 28.01.14 — 09:20

(84) ищет. только не находит, ибо у тебя реквизит строка, а в документе — не строка

   kotokent

87 — 28.01.14 — 09:20

(79) не плохо, но через какую функцию

   Любопытная

88 — 28.01.14 — 09:21

А, я сначала не читала. Ссылку со строкой попутали, да?

   George Wheels

89 — 28.01.14 — 09:21

(84) Какого типа реквизит «Ответственный» в документе? И какого типа «РеквизитОтветственный»?

   kotokent

90 — 28.01.14 — 09:21

   kotokent

91 — 28.01.14 — 09:21

(85)

Процедура ЗаписатьНажатие(Элемент)

    РеквизитОтветственный = Ответственный;

    ТекДокумент = Документы.РеализацияТоваровУслуг;

    РезультатПоискаПоРеквизиту = ТекДокумент.НайтиПоРеквизиту(«Ответственный»,РеквизитОтветственный);

    
    Если РезультатПоискаПоРеквизиту = ТекДокумент.ПустаяСсылка() Тогда

        Сообщить(«ваыываыв»);

    Иначе

        Сообщить(«Не найден»);

    КонецЕсли;

    
    //Документы.РеализацияТоваровУслуг.Выбрать(«»,»», Элементы.Ответственный);

    //Документы.РеализацияТоваровУслуг.НайтиПоРеквизиту(«Комментарий»,);

    //Сообщить(Документы.РеализацияТоваровУслуг.Выбрать(«Номер»));

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

   Любопытная

92 — 28.01.14 — 09:21

(87) Запрос, дружище.

   kotokent

93 — 28.01.14 — 09:21

(89) строки

   Wobland

94 — 28.01.14 — 09:22

+(92) текст просьбы в (10)

   kotokent

95 — 28.01.14 — 09:22

(92) это весь код менять придется

   Любопытная

96 — 28.01.14 — 09:22

РеквизитОтветственный = Ответственный; — это что за… чудеса?

В документе РТиУ Ответственный — СправочникСсылка.Пользователи. А у тебя Ответственный — строка.

Думай

   Wobland

97 — 28.01.14 — 09:23

(95) вот такая у нас адова работа — коды править

   George Wheels

98 — 28.01.14 — 09:23

(95) А его и так менять надо.

   kotokent

99 — 28.01.14 — 09:24

(96) т.е. он у меня просто пользователя смотрит… а я спрашивал как считать поле с формы

   kotokent

100 — 28.01.14 — 09:24

Обед

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

Если реквизит отсутствует в справочнике, то возвращается Неопределено.

Пример:

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

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

//   Место = «Фабрика»;

Документы.ПоступлениеТоваров.НайтиПоРеквизиту(«МестоХранения», Место);

//  «МестоХранения» это название реквизита на форме документа «ПоступлениеТоваров»;

//   Место — это переменная содержащая    название искомого Места Хранения

Если Вы хотите больше узнать о программировании в 1С, тогда

Если Вы хотите больше узнать о программировании в 1С, тогда регистрируйтесь на курс: 1С 8.3 Старт >>>

Изображение

Присоединяетесь к нашей группе телеграмм: Здесь вы получите ценную помощь от умного бота «Коли» (ChatGPT) + знания сотен ее участников.

Похожие записи

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

В статье приводятся практические примеры работы с документами в языке 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С 8.3 найти документ в списке?

25.11.2019

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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