Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383

Как получать остатки номенклатуры по Складу Готовой Продукции?

06.02.2026, 10:44. Показов 443. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть такая: Есть документ КоммерческоеПредложениеКлиенту, в нём табличная часть Товары. В ней я сделал реквизит (колонку) СвободныйОстаток. Когда пользователь открывает документ или заполняет его новой номенклатурой, то в эту колонку должна подтягиваться информация по количеству оставшейся номенклатуры из регистра ТоварыНаСкладахОстатки. Проблема в том, что я не понимаю как это сделать, чтобы не считать и не делать запрос при изменении в каждой строке таблицы Товары?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2026, 10:44
Ответы с готовыми решениями:

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

Остатки по складу
Есть у меня отчет остатки по регистру накопления остатки. Как сделать так чтоб количество остатков...

Как изменять отбор номенклатуры по флагу Остатки?
Мне нужно в справочнике Номенклатура в форме выбора, в зависимости от галки (ФлагОстатки -...

14
Эксперт 1С
2199 / 245 / 73
Регистрация: 12.11.2015
Сообщений: 1,521
06.02.2026, 10:59
Колонка - это реквизит формы или объекта? Она хранит данные?
Пользователь может еще руками добавлять строки в документ...
0
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383
06.02.2026, 11:05  [ТС]
Цитата Сообщение от slypower Посмотреть сообщение
Колонка - это реквизит формы или объекта? Она хранит данные?
Пользователь может еще руками добавлять строки в документ...
Колонка "СвободныйОстаток" - это реквизит формы, в самом документе нет такого реквизита, то есть через Элементы.СвободныйОстаток можно обратиться. Пользователь может накидывать новых строк
Миниатюры
Как получать остатки номенклатуры по Складу Готовой Продукции?  
0
Эксперт 1С
6328 / 1749 / 638
Регистрация: 16.01.2015
Сообщений: 7,277
06.02.2026, 11:09
Kamazov, Если количество записей в ТЧ КП небольшое, то пойдет и запрос в каждой строке (к вирт таблице с отбором по номенклатуре в строке), тем более, что, при определенных условиях, НоменклатураПриИзменении предполагает обращение к серверу в типовом коде, можно совместить.
Но если количество записей зашкаливает - делай по кнопке. Заполнил ТЧ, нажал кнопку, один запрос к вирт таблице уже с отбором в массиве номенклатуры из ТЧ
0
Эксперт 1С
2199 / 245 / 73
Регистрация: 12.11.2015
Сообщений: 1,521
06.02.2026, 11:11
Тогда вызывать процедуру (приСозданииНаСервере и после заполнения документа по кнопке), в которой написать запрос на получение списка номенклатуры из документа по регистру, потом уже выборку пройти и подставить данные в строки.
Но при добавлении рукой вам нужно тоже дергать эту процедуру и получать остаток для подстановки данных.
1
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383
06.02.2026, 11:14  [ТС]
Цитата Сообщение от polax Посмотреть сообщение
Kamazov, Если количество записей в ТЧ КП небольшое, то пойдет и запрос в каждой строке (к вирт таблице с отбором по номенклатуре в строке), тем более, что, при определенных условиях, НоменклатураПриИзменении предполагает обращение к серверу в типовом коде, можно совместить.
Но если количество записей зашкаливает - делай по кнопке. Заполнил ТЧ, нажал кнопку, один запрос к вирт таблице уже с отбором в массиве номенклатуры из ТЧ
Иногда несколько сотен строк. Говорят можно получить данные из регистра по остаткам, сохранить их в ТЗ или как-то там кешировать, потом каким-то макаром пробежаться по всем строкам таблицы Товары и в каждую строку, по соответствию номенклатуры, записать остаток
0
Модератор
Эксперт 1С
 Аватар для Yulunga
4137 / 944 / 265
Регистрация: 22.04.2013
Сообщений: 6,584
Записей в блоге: 1
06.02.2026, 11:39
потом второй манагер открыл свой документ на соседнем компе, продал сто комбайнов из ста возможных. а ты сидишь такой радостный, ещё сто продаёшь. они же у тебя закешированы
1
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383
06.02.2026, 11:50  [ТС]
Цитата Сообщение от Yulunga Посмотреть сообщение
потом второй манагер открыл свой документ на соседнем компе, продал сто комбайнов из ста возможных. а ты сидишь такой радостный, ещё сто продаёшь. они же у тебя закешированы
Не ну наверное есть какой-то способ, чтобы остаток обновлялся без переписывания в каждой строке и без нажатия на кнопку
0
Эксперт 1С
6328 / 1749 / 638
Регистрация: 16.01.2015
Сообщений: 7,277
06.02.2026, 13:10
Цитата Сообщение от Kamazov Посмотреть сообщение
без переписывания в каждой строке и без нажатия на кнопку
Например, ПередЗаписьюНаСервере заполнять все строки ТЧ остатками
0
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383
06.02.2026, 13:39  [ТС]
А если вот так? Вроде работает



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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
&НаСервере
Функция ПолучитьАдресСвободныхОстатков_Сервер(ДатаДок) Экспорт
 
    ДатаОстатков = ДатаДок;
    Если Не ЗначениеЗаполнено(ДатаОстатков) Тогда
        ДатаОстатков = ТекущаяДата();
    КонецЕсли;
 
    СкладГП = Справочники.Склады.НайтиПоНаименованию("Склад Готовой Продукции");
    Если СкладГП.Пустая() Тогда
        Возврат Неопределено;
    КонецЕсли;
 
    // ---- соберём уникальные номенклатуры ----
    МассивНом = Новый Массив;
 
    Для каждого Стр Из Объект.Товары Цикл
        Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
            Найдена = Ложь;
            Для каждого Н Из МассивНом Цикл
                Если Н = Стр.Номенклатура Тогда
                    Найдена = Истина;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
 
            Если Не Найдена Тогда
                МассивНом.Добавить(Стр.Номенклатура);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
 
    Если МассивНом.Количество() = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;
 
    // ---- запрос ----
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |   СУММА(ТоварыНаСкладахОстатки.ВНаличииОстаток) КАК СвободныйОстаток
    |ИЗ
    |   РегистрНакопления.ТоварыНаСкладах.Остатки(
    |           &ДатаОстатков,
    |           Склад = &Склад
    |               И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
    |               И Номенклатура В (&Номенклатура)) КАК ТоварыНаСкладахОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |   ТоварыНаСкладахОстатки.Номенклатура";
 
    Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
    Запрос.УстановитьПараметр("Склад", СкладГП);
    Запрос.УстановитьПараметр("Номенклатура", МассивНом);
 
    ТЗОст = Запрос.Выполнить().Выгрузить();
 
    // Преобразуем таблицу значений в структуру для передачи через временное хранилище
    СоответствиеОстатков = Новый Соответствие;
    Для каждого СтрТЗ Из ТЗОст Цикл
        СоответствиеОстатков.Вставить(СтрТЗ.Номенклатура, СтрТЗ.СвободныйОстаток);
    КонецЦикла;
 
    Адрес = ПоместитьВоВременноеХранилище(СоответствиеОстатков);
    Возврат Адрес;
 
КонецФункции
 
&НаКлиенте
Процедура ОбновитьСвободныеОстатки() Экспорт
 
    АдресТЗ = ПолучитьАдресСвободныхОстатков_Сервер(Объект.Дата);
 
    Если Не ЗначениеЗаполнено(АдресТЗ) Тогда
        // на всякий — обнулим колонку
        Для каждого Стр Из Объект.Товары Цикл
            Стр.СвободныйОстаток = 0;
        КонецЦикла;
        Возврат;
    КонецЕсли;
 
    // Получаем соответствие вместо таблицы значений
    СоответствиеОстатков = ПолучитьИзВременногоХранилища(АдресТЗ);
 
    Для каждого Стр Из Объект.Товары Цикл
        Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
            // Ищем остаток в соответствии по номенклатуре
            Остаток = СоответствиеОстатков.Получить(Стр.Номенклатура);
            Если Остаток = Неопределено Тогда
                Стр.СвободныйОстаток = 0;
            Иначе
                Стр.СвободныйОстаток = Остаток;
            КонецЕсли;
        Иначе
            Стр.СвободныйОстаток = 0;
        КонецЕсли;
    КонецЦикла;
 
КонецПроцедуры
Добавлено через 48 секунд
А если вот так? Вроде работает. Критика приветствуется



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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
&НаСервере
Функция ПолучитьАдресСвободныхОстатков_Сервер(ДатаДок) Экспорт
 
    ДатаОстатков = ДатаДок;
    Если Не ЗначениеЗаполнено(ДатаОстатков) Тогда
        ДатаОстатков = ТекущаяДата();
    КонецЕсли;
 
    СкладГП = Справочники.Склады.НайтиПоНаименованию("Склад Готовой Продукции");
    Если СкладГП.Пустая() Тогда
        Возврат Неопределено;
    КонецЕсли;
 
    // ---- соберём уникальные номенклатуры ----
    МассивНом = Новый Массив;
 
    Для каждого Стр Из Объект.Товары Цикл
        Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
            Найдена = Ложь;
            Для каждого Н Из МассивНом Цикл
                Если Н = Стр.Номенклатура Тогда
                    Найдена = Истина;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
 
            Если Не Найдена Тогда
                МассивНом.Добавить(Стр.Номенклатура);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
 
    Если МассивНом.Количество() = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;
 
    // ---- запрос ----
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |   СУММА(ТоварыНаСкладахОстатки.ВНаличииОстаток) КАК СвободныйОстаток
    |ИЗ
    |   РегистрНакопления.ТоварыНаСкладах.Остатки(
    |           &ДатаОстатков,
    |           Склад = &Склад
    |               И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
    |               И Номенклатура В (&Номенклатура)) КАК ТоварыНаСкладахОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |   ТоварыНаСкладахОстатки.Номенклатура";
 
    Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
    Запрос.УстановитьПараметр("Склад", СкладГП);
    Запрос.УстановитьПараметр("Номенклатура", МассивНом);
 
    ТЗОст = Запрос.Выполнить().Выгрузить();
 
    // Преобразуем таблицу значений в структуру для передачи через временное хранилище
    СоответствиеОстатков = Новый Соответствие;
    Для каждого СтрТЗ Из ТЗОст Цикл
        СоответствиеОстатков.Вставить(СтрТЗ.Номенклатура, СтрТЗ.СвободныйОстаток);
    КонецЦикла;
 
    Адрес = ПоместитьВоВременноеХранилище(СоответствиеОстатков);
    Возврат Адрес;
 
КонецФункции
 
&НаКлиенте
Процедура ОбновитьСвободныеОстатки() Экспорт
 
    АдресТЗ = ПолучитьАдресСвободныхОстатков_Сервер(Объект.Дата);
 
    Если Не ЗначениеЗаполнено(АдресТЗ) Тогда
        // на всякий — обнулим колонку
        Для каждого Стр Из Объект.Товары Цикл
            Стр.СвободныйОстаток = 0;
        КонецЦикла;
        Возврат;
    КонецЕсли;
 
    // Получаем соответствие вместо таблицы значений
    СоответствиеОстатков = ПолучитьИзВременногоХранилища(АдресТЗ);
 
    Для каждого Стр Из Объект.Товары Цикл
        Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
            // Ищем остаток в соответствии по номенклатуре
            Остаток = СоответствиеОстатков.Получить(Стр.Номенклатура);
            Если Остаток = Неопределено Тогда
                Стр.СвободныйОстаток = 0;
            Иначе
                Стр.СвободныйОстаток = Остаток;
            КонецЕсли;
        Иначе
            Стр.СвободныйОстаток = 0;
        КонецЕсли;
    КонецЦикла;
 
КонецПроцедуры
0
Эксперт 1С
6328 / 1749 / 638
Регистрация: 16.01.2015
Сообщений: 7,277
06.02.2026, 13:57
Цитата Сообщение от Kamazov Посмотреть сообщение
Процедура ОбновитьСвободныеОстатки()
А как и когда эта процедура вызывается? Ведь как раз в этом был вопрос. Ответа в представленном коде нет.
ЗЫ: ну и и код конечно перекручен очень, можно и нужно значительно проще. Алгоритм примерно:
1. На клиенте вызвать серверную процедуру (можно упустить, если не по кнопке, а сразу делать запрос в событии)
2. На сервере запрос к ТЗ, полученной выгрузкой ТЧ текущего документа, с левым соединением РН Остатки (вирт таб, с отбором в массиве выгруженной колонки ТЧ Номенклатура и периодом ТекущаяДата)
3. Выгрузить результат запроса, загрузить в ТЧ (или очистить ТЧ и в цикле Пока заполнить выборкой)
0
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383
06.02.2026, 14:25  [ТС]
Цитата Сообщение от polax Посмотреть сообщение
А как и когда эта процедура вызывается? Ведь как раз в этом был вопрос. Ответа в представленном коде нет.
ЗЫ: ну и и код конечно перекручен очень, можно и нужно значительно проще. Алгоритм примерно:
1. На клиенте вызвать серверную процедуру (можно упустить, если не по кнопке, а сразу делать запрос в событии)
2. На сервере запрос к ТЗ, полученной выгрузкой ТЧ текущего документа, с левым соединением РН Остатки (вирт таб, с отбором в массиве выгруженной колонки ТЧ Номенклатура и периодом ТекущаяДата)
3. Выгрузить результат запроса, загрузить в ТЧ (или очистить ТЧ и в цикле Пока заполнить выборкой)
"ОбновитьСвободныеОстатки()" в процедуре ПриОткрытии() формы и в процедуре ЗагрузкаЭМИ(), так-то ещё надо бы при изменении номенклатуры, но я этого не добавлял
0
Эксперт 1С
6328 / 1749 / 638
Регистрация: 16.01.2015
Сообщений: 7,277
06.02.2026, 14:49
Цитата Сообщение от Kamazov Посмотреть сообщение
"ОбновитьСвободныеОстатки()" в процедуре ПриОткрытии() формы и в процедуре ЗагрузкаЭМИ()
Не знаю что такое ЗагрузкаЭМИ(), но в ПриОткрытии вариант так себе.
Во-первых. Манегер делает КП, и теперь чтобы его распечатать, отправить или еще что-то сделать, он должен сначала ЗАКРЫТЬ документ, потом его же снова ОТКРЫТЬ только тогда заполнится колонка остатки. Вот они счастливы будут от такого действия.... представляю. Делай в ПриЗаписиНаСервере. Док и записался и появились остатки
Во-вторых. ЗАЧЕМ тогда делать это в ПриОткрытии и лишний раз дергать сервер? Тогда уж делай все в ПриСозданииНаСервере до перехода на клиент
ну и в третьих, еще раз. Очень много лишнего в коде. Сбор только массива номенклатуры из ТЧ почти на страницу, хтя ВыгрузитьКолонку - одна строчка
1
 Аватар для Kamazov
4 / 3 / 1
Регистрация: 05.01.2022
Сообщений: 383
06.02.2026, 18:44  [ТС]
Цитата Сообщение от polax Посмотреть сообщение
Во-вторых. ЗАЧЕМ тогда делать это в ПриОткрытии и лишний раз дергать сервер? Тогда уж делай все в ПриСозданииНаСервере до перехода на клиент
ну и в третьих, еще раз. Очень много лишнего в коде. Сбор только массива номенклатуры из ТЧ почти на страницу, хтя ВыгрузитьКолонку - одна строчка
Так я и сказал, что критика приветствуется. Если можешь, то покажи пожалуйста сокращённый и более красивый вариант. Буду знать как делать правильно Насчёт ПриСозданииНаСервере - наверное оно действительно так лучше будет. ЗагрузкаЭМИ() - это процедура, которая переносит данные из ФормыЗагрузкиЭми в ФормуДокументаЭМИ. Менеджер накидывает товар в ФормеЗагрузкеЭМИ и потом он переносится на форму документа. Это сделано в основном для того, чтобы можно было из экселя копировать и вставлять в документ наименование номенклатуры
0
Эксперт 1С
6328 / 1749 / 638
Регистрация: 16.01.2015
Сообщений: 7,277
06.02.2026, 19:29
Цитата Сообщение от Kamazov Посмотреть сообщение
покажи пожалуйста сокращённый и более красивый вариант
Ну блииин, разжевал же. Хорошо, но дальше сам
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
Запрос.Текст =
"ВЫБРАТЬ
ТЗ.Номенклатура КАК Номенклатура
// остальные поля из ТЧ
ПОМЕСТИТЬ ВТ_ТЗ
ИЗ
&ТЗ КАК ТЗ
;
//////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ТЗ.Номенклатура КАК Номенклатура,
//Остальные поля из ВТ_ТЗ
ЕСТЬNULL(РН.КоличествоОстаток,0) КАК Остаток
ИЗ
ВТ_ТЗ КАК ВТ_ТЗ
ЛЕВОЕ СОЕДИНЕНИЕ 
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Номенклатура В (&МассивНоменклатуры)) КАК РН
ПО ВТ_ТЗ.Номенклатура = РН.Номенклатура";
ТЗвБазе = Объект.Товары.Выгрузить();
Запрос.УстановитьПараметр("ТЗ",ТЗвБазе);
Запрос.УстановитьПараметр(Период",ТекущаяДата());
МассивНоменклатуры = Объект.Товары.ВыгрузитьКолонку("Номенклатура");
Запрос.УстановитьПараметр("МассивНоменклатуры",МассивНоменклатуры);
Результат = Запрос.Выполнить().Выгрузить();
Объект.Товары.Загрузить(Результат);
Можно еще три строчки сократить, но сделал подробней, чтобы было понятней откуда что взялось
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2026, 19:29
Помогаю со студенческими работами здесь

Поле "разделитель", появляется в виртуальных таблицах остатки и обороты или только в остатки?
ййй

БП 3: как получить счета номенклатуры из регистра "счет учета номенклатуры"?
Добрый день Подскажите как получить счета номенклатуры из регистра "счет учета номенклатуры" ...

Остатки номенклатуры
Приветствую! В общем, имеется учебная задачка 1С 8.3. Конфигурация имеет пару справочников для...

Отрицательне Остатки Номенклатуры
Доброго всем времени суток! Помогите пожалуйста разобраться в следующей проблеме: У клиента...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru