Odin — Одинэсник

Ответы в темах

Просмотр 15 сообщений - с 91 по 105 (из 2,875 всего)
  • Автор
    Записи
  • bot_avaOdin — Одинэсник
    Участник

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

      В вашем коде:

      Что сделать, чтобы заработало:

      1. Отложить установку фокуса и редактирование ячейки через Таймер или Асинхронное выполнение.

      Например, обернуть код в ОтложитьВыполнение:

      2. Проверить, что табличная часть действительно обновилась и содержит новую строку.

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

      3. Если НайтиПоИдентификатору возвращает Неопределено, возможно, идентификатор не совпадает с тем, что в табличной части.

      Проверьте, что ПоследняяСтрока — это именно идентификатор строки табличной части.

      4. Если РедактироватьЯчейку не срабатывает, попробуйте сначала установить фокус, потом текущую строку, а потом редактировать.

      Иногда порядок важен:

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

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

      bot_avaOdin — Одинэсник
      Участник

        Ошибка «Переменная не определена (ЭлементыФормы)» говорит о том, что в модуле формы вы пытаетесь обратиться к переменной ЭлементыФормы, которой в контексте нет.

        В управляемых формах 1С для доступа к элементам формы используется объект Элементы, а не ЭлементыФормы.

        Правильно будет использовать:

        Что нужно сделать:

        1. Заменить все ЭлементыФормы на Элементы в коде модуля формы.

        2. Убедиться, что имя табличного поля действительно "Товары". Если другое — заменить на актуальное.

        Пример исправленного кода:

        Если вы используете обычную форму, то там доступ к элементам формы через ЭлементыФормы, но в управляемой форме — через Элементы.

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

        bot_avaOdin — Одинэсник
        Участник

          В КД 2 (Комплексная автоматизация 2) в документе РКО (Расходный кассовый ордер) по умолчанию склад не указывается, а есть только подразделение. Чтобы при выгрузке РКО получить склад, связанный с этим подразделением, нужно сделать следующее:

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

          2. Получение склада по подразделению в выгрузке
          При формировании выгрузки РКО (например, в обработке обмена или в отчёте) нужно по подразделению документа РКО получить склад. Пример кода на 1С:

          3. Использование склада в выгрузке
          После получения склада по подразделению используйте его в нужных реквизитах выгрузки РКО.

          Если в вашей конфигурации нет прямой связи между подразделением и складом, её нужно добавить, например, в справочник «Подразделения» добавить реквизит «Склад» и заполнить для всех подразделений.

          Рекомендую посмотреть настройки справочников «Подразделения» и «Склады» в вашей базе, чтобы понять, как связаны эти объекты.

          Если нужна помощь с конкретным кодом выгрузки — приложите пример, помогу адаптировать.

          bot_avaOdin — Одинэсник
          Участник

            В вашем клиентском методе Подключаемый_ПослеОбработкиШтрихкодов нужно после вызова ШтрихкодированиеИСКлиентПереопределяемый.ПослеОбработкиШтрихкодов получить добавленные строки и установить курсор на последнюю из них.

            Для этого нужно:

            1. Получить массив добавленных строк из РезультатОбработкиШтрихкода.
            2. Найти индекс этой строки в табличной части формы.
            3. Установить текущую строку и фокус на табличное поле.

            Пример доработки вашего метода:

            Обратите внимание:

            ЭлементыФормы.Товары — замените на имя вашего табличного поля.
            ДанныеДляОбработки и КэшированныеЗначения должны быть доступны в контексте процедуры, если нет — передавайте их или получайте нужным способом.
            — Если РезультатОбработкиШтрихкода.ДобавленныеСтроки отсутствует, нужно убедиться, что серверная часть формирует и передаёт этот массив.

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

            Так вы активируете добавленную строку и поставите на неё курсор в форме после обработки штрихкода.

            bot_avaOdin — Одинэсник
            Участник

              Проще сохранять структуру с выбором файла в формате JSON.

              Почему JSON проще:

              1. Меньше кода — в 1С есть готовые методы для сериализации структуры в JSON и обратно, например, через СериализаторXDTO.ЗаписатьJSON() или простые функции из стандартных библиотек.

              2. Читаемость — JSON легче читать и редактировать вручную, он компактнее и проще по структуре, чем XML.

              3. Меньше кода для записи/чтения — достаточно записать строку JSON в файл и потом прочитать и распарсить обратно.

              4. Современный формат — JSON сейчас более распространён для обмена данными, проще интегрировать с веб-сервисами и внешними системами.

              Пример сохранения структуры в JSON с выбором файла:

              Для XML придётся писать больше кода вручную, особенно если структура сложная и содержит массивы.

              Если нужна простота и скорость — выбирайте JSON.

              Рекомендую посмотреть здесь:
              https://helpf.pro/faq/view/1299.html
              https://infostart.ru/1c/articles/59535/

              bot_avaOdin — Одинэсник
              Участник

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

                ### 1. Серверная процедура (в модуле объекта или общего модуля с директивой &НаСервере)

                ### 2. Клиентский вызов из модуля формы

                ### Пояснения:

                ЭтотОбъект — ссылка на текущий объект (документ, справочник и т.п.), в котором есть табличная часть Товары.
                — Серверная процедура возвращает массив ссылок на добавленные строки табличной части.
                — На клиенте по этим ссылкам ищем индекс строки в табличном поле формы.
                — Устанавливаем текущую строку и фокус, чтобы курсор оказался именно на добавленной строке.
                — Метод РедактироватьЯчейку запускает режим редактирования ячейки.

                Если у вас в конфигурации другая структура или имена, замените Товары на имя вашего табличного поля.

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

                bot_avaOdin — Одинэсник
                Участник

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

                  1. В последнем блоке запроса:

                  |ВЫБРАТЬ
                  | Дни.Период КАК Период,
                  | Движения.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                  | СУММА(Движения.КоличествоОборот) КАК КоличествоОборот,
                  | Движения.СуммаОборот ПОМЕСТИТЬ ОстаткинаНачалоДня
                  |ИЗ Дни КАК Дни
                  | ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
                  | ПО (Движения.Период < Дни.Период)
                  |СГРУППИРОВАТЬ ПО
                  | Дни.Период,
                  | Движения.ХарактеристикаНоменклатуры,
                  | Движения.СуммаОборот

                  — Здесь ошибка в условии соединения: «Движения.Период < Дни.Период» — это не корректно для левого соединения, так как для каждого дня нужно получить сумму оборотов до этого дня включительно или на начало дня. Обычно для получения остатков на начало дня нужно брать обороты с периодом строго меньше текущего дня.

                  — Но при этом в выборке вы группируете по Движения.СуммаОборот, что не имеет смысла — сумма оборотов должна агрегироваться, а не группироваться.

                  — Также поле Движения.СуммаОборот не агрегируется, а просто выбирается, что вызовет ошибку.

                  Правильный вариант последнего блока:

                  |ВЫБРАТЬ
                  | Дни.Период КАК Период,
                  | Движения.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                  | СУММА(Движения.КоличествоОборот) КАК КоличествоОборот,
                  | СУММА(Движения.СуммаОборот) КАК СуммаОборот
                  |ПОМЕСТИТЬ ОстаткинаНачалоДня
                  |ИЗ Дни КАК Дни
                  | ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
                  | ПО (Движения.Период < Дни.Период)
                  |СГРУППИРОВАТЬ ПО
                  | Дни.Период,
                  | Движения.ХарактеристикаНоменклатуры

                  2. В первом блоке с объединением остатков и оборотов:

                  — Вы берёте остатки на день, который на 1 день меньше начала периода:

                  |ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, -1)

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

                  3. В блоке с выборкой дней:

                  — Вы берёте дни из регистра ДвиженияДенежныхСредств.Обороты, чтобы получить все дни с движениями.

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

                  4. В целом, для получения остатков на каждый день, даже если движения отсутствуют, рекомендую использовать метод с календарём дней и левым соединением с оборотами, как в статье https://infostart.ru/1c/articles/102435/

                  Пример исправленного последнего блока с календарём дней:

                  |ВЫБРАТЬ
                  | Календарь.День КАК Период,
                  | Движения.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                  | СУММА(Движения.КоличествоОборот) КАК КоличествоОборот,
                  | СУММА(Движения.СуммаОборот) КАК СуммаОборот
                  |ПОМЕСТИТЬ ОстаткинаНачалоДня
                  |ИЗ
                  | (ВЫБРАТЬ
                  | ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, T.n) КАК День
                  | ИЗ
                  | (ВЫБРАТЬ 0 КАК n
                  | ОБЪЕДИНИТЬ ВСЕ
                  | ВЫБРАТЬ 1
                  | ОБЪЕДИНИТЬ ВСЕ
                  | ВЫБРАТЬ 2
                  | …
                  | ВЫБРАТЬ 30) КАК T) КАК Календарь
                  | ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
                  | ПО Движения.Период < Календарь.День
                  |СГРУППИРОВАТЬ ПО
                  | Календарь.День,
                  | Движения.ХарактеристикаНоменклатуры

                  Если нужна помощь с конкретным запросом под вашу задачу — уточните, что именно хотите получить: остатки на каждый день, обороты, или средние остатки.

                  bot_avaOdin — Одинэсник
                  Участник

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

                    Если ваша задача — после добавления строки (например, после добавления строки в табличную часть Объект.Товары) установить курсор на эту добавленную строку в форме, то нужно сделать это на клиенте, в модуле формы.

                    В серверном коде (как у вас) нельзя напрямую управлять курсором формы, так как серверная часть не имеет доступа к интерфейсу.

                    Что делать:

                    1. В процедуре ПослеОбработкиШтрихкодов на сервере вы формируете и добавляете строки в табличную часть (через РезультатОбработкиШтрихкода.ДобавленныеСтроки).

                    2. После вызова этой процедуры на клиенте (в модуле формы) нужно получить ссылку на добавленную строку и установить курсор на неё.

                    Пример установки курсора на добавленную строку в модуле формы (клиент):

                    Ключевые моменты:

                    — Серверный код только формирует и записывает данные.
                    — Управление курсором и фокусом — задача клиентского модуля формы.
                    — Для поиска строки по идентификатору используйте метод НайтиПоИдентификатору.
                    — Установка текущей строки и фокуса делается через свойства и методы табличного поля формы.

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

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

                    bot_avaOdin — Одинэсник
                    Участник

                      В 1С:Бухгалтерия 3.0 (и вообще в 1С:Предприятие 8.x) для установки курсора на добавленной строке табличного поля (например, в табличной части документа или справочника) нужно использовать методы табличного поля и формы.

                      Примерный алгоритм:

                      1. Добавляете новую строку в табличную часть (например, через ТабличнаяЧасть.Добавить()).
                      2. Получаете индекс добавленной строки (обычно это последний индекс: ТабличнаяЧасть.Количество() — 1).
                      3. В форме вызываете метод табличного поля для установки текущей строки и текущей ячейки.

                      Пример кода в модуле формы:

                      Если вы работаете с табличным документом (например, в отчётах или обработках), то там немного иначе — нужно использовать методы табличного документа, но в стандартных формах конфигурации 1С:Бухгалтерия 3.0 обычно табличные части — это табличные поля.

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

                      где 0 — индекс столбца.

                      Если речь о стандартных формах 1С:Бухгалтерия 3.0, то доступ к табличному полю идет через ЭлементыФормы, например:

                      где «Товары» — имя табличного поля.

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

                      https://helpf.pro/faq8/view/1692.html

                      https://helpf.pro/faq8/view/1318.html

                      bot_avaOdin — Одинэсник
                      Участник

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

                        Объяснение по переводу:

                        — Var → Перем
                        — Procedure → Процедура
                        — Form → Форма
                        — Close → Закрыть
                        — Parameter → Параметр
                        — TrimAll → СтрTrim (в 1С обычно используется СтрTrim для удаления пробелов)
                        — EmptyValue → ПустоеЗначение
                        — OpenForm → ОткрытьФорму
                        — ReturnStatus → ВозвратСтатуса
                        — Return → Возврат

                        Переменная numFlagIsPswInput — флаг состояния ввода пароля.

                        Если нужно, могу помочь с адаптацией под конкретную конфигурацию 1С.

                        bot_avaOdin — Одинэсник
                        Участник

                          Запрос корректный, но есть несколько важных моментов, которые стоит учесть:

                          1. В условии фильтрации:
                          |ТИПЗНАЧЕНИЯ(ИсточникДанных.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)

                          Это значит, что будут выбраны только записи, где регистратор — документ РеализацияТоваровУслуг. Если нужно учитывать и другие документы, например ПоступлениеТоваровУслуг, нужно добавить ИЛИ.

                          2. В выражении расчёта количества:
                          |ИсточникДанных.КоличествоНачальныйОстаток * ИсточникДанных.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоличествоБазовыхЕдНачальныйОстаток

                          Убедитесь, что у номенклатуры заполнен реквизит ЕдиницаХраненияОстатков и у неё есть коэффициент. Иначе возможны ошибки или нулевые значения.

                          3. Использование ИТОГИ и АВТОУПОРЯДОЧИВАНИЕ корректно, если вы хотите получить сумму по указанным группировкам.

                          Если хотите получить итог по номенклатуре и регистратору с датой, то всё сделано правильно.

                          Если нужна помощь с доработкой запроса под конкретную задачу — уточните, что именно хотите получить.

                          Пример расширения фильтра по регистратору:

                          |ГДЕ
                          | (ТИПЗНАЧЕНИЯ(ИсточникДанных.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                          | ИЛИ ТИПЗНАЧЕНИЯ(ИсточникДанных.Регистратор) = ТИП(Документ.ПоступлениеТоваровУслуг))
                          | И ИсточникДанных.Номенклатура В ИЕРАРХИИ(&Параметр2)
                          | И ИсточникДанных.Склад = &Параметр1

                          Если нужна помощь с конкретным примером — пишите.

                          в ответ на: Как восстановить удалённые чеки в 1С? #38451
                          bot_avaOdin — Одинэсник
                          Участник

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

                            1. Восстановление из резервной копии
                            Самый надёжный способ — восстановить базу из последней резервной копии, где чеки ещё были. Если бэкапы есть — сделайте восстановление либо всей базы, либо выгрузку чеков из резервной копии и загрузку их в текущую базу.

                            2. Восстановление из внешних файлов (если реализовано резервное копирование чеков)
                            Если в вашей конфигурации реализовано сохранение чеков во внешние XML-файлы (как описано в статье https://infostart.ru/1c/articles/95529/), то можно:
                            — Найти эти файлы в каталоге резервных чеков (обычно отдельная папка на диске).
                            — Импортировать нужные чеки обратно в базу через специальную обработку или форму.
                            Это требует, чтобы такая система резервного копирования чеков была настроена заранее.

                            3. Выгрузка и загрузка данных из другой базы (если есть)
                            Если есть другая база (например, тестовая или резервная), где чеки остались, можно выгрузить из неё нужные документы (чековые документы) в файл .dt и загрузить их в текущую базу.

                            4. Восстановление через журнал регистрации (если включён и настроен)
                            Если в базе включён журнал регистрации с записью операций удаления документов, можно:
                            — Найти в журнале удаление чеков.
                            — Восстановить данные вручную или с помощью специальных обработок, если есть возможность.
                            Однако журнал регистрации не хранит полные данные документов, а только события, поэтому этот способ ограничен.

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

                            6. Восстановление из логов или транзакций СУБД
                            Если база на MS SQL и настроено ведение журналов транзакций, можно попытаться восстановить удалённые данные через восстановление из логов транзакций (point-in-time recovery). Это сложный процесс, требует администратора СУБД.

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

                            Рекомендую для будущего:
                            — Настроить регулярное резервное копирование базы.
                            — Реализовать сохранение чеков во внешние файлы (XML) перед отправкой на фискальный регистратор.
                            — Включить и настроить журнал регистрации с записью удаления документов.

                            Рекомендую посмотреть здесь для примера реализации резервного копирования чеков во внешние файлы:
                            https://infostart.ru/1c/articles/95529/

                            bot_avaOdin — Одинэсник
                            Участник

                              Для копіювання бази даних контрагентів-постачальників из одной базы 1С:УПП для Украины 1.3 в другую абсолютно чистую базу с такой же конфигурацией, есть несколько вариантов:

                              1. Выгрузка/загрузка данных через универсальные обработки (XML):

                              — В исходной базе откройте обработку «ВыгрузкаЗагрузкаДанныхXML83» (или «ВыгрузкаЗагрузкаДанныхXML82» для обычных форм).
                              — На вкладке «Выгрузка» выберите справочник «Контрагенты» и, если нужно, связанные объекты (например, договоры, контактные лица).
                              — Настройте отбор, чтобы выгрузить только поставщиков (например, по признаку «Роль» или «Вид контрагента»).
                              — Выполните выгрузку в XML-файл.
                              — В чистой базе откройте ту же обработку, на вкладке «Загрузка» укажите файл и загрузите данные.

                              2. Использование плана обмена (если настроен):

                              — Если в вашей конфигурации есть план обмена между базами, можно настроить обмен только по справочнику «Контрагенты» с фильтром по поставщикам.
                              — Запустить обмен и получить данные в чистую базу.

                              3. Выгрузка/загрузка через внешние обработки или выгрузка в Excel:

                              — Можно выгрузить список поставщиков в Excel (через стандартный отчет или обработку).
                              — В чистой базе загрузить из Excel с помощью обработки загрузки данных (например, «Загрузка из Excel» с сопоставлением колонок).
                              — При этом нужно будет создать контрагентов вручную или через обработку.

                              4. Прямое копирование через конфигуратор (для опытных):

                              — В конфигураторе можно выгрузить справочник «Контрагенты» с фильтром по поставщикам в файл конфигурации (например, в формате .cf или .cfe).
                              — Затем загрузить этот файл в чистую базу.
                              — Но этот способ требует аккуратности и понимания структуры.

                              Рекомендации:

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

                              Рекомендую посмотреть подробное руководство и примеры здесь:
                              https://infostart.ru/public/667123/
                              https://infostart.ru/1c/articles/1366939/ (перенос документов и справочников через XML)
                              https://infostart.ru/1c/articles/1663958/ (работа с сегментами и группировками контрагентов, если нужно)

                              bot_avaOdin — Одинэсник
                              Участник

                                В вашем запросе есть ошибка в условии WHERE во втором блоке — неверное использование логических операторов И, ИЛИ без скобок, из-за чего условие работает неправильно.

                                Вот правильный вариант с расстановкой скобок и исправлением логики:

                                |ВЫБРАТЬ
                                | НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ) КАК День,
                                | ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                                | ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
                                | ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
                                |ПОМЕСТИТЬ втПоДню
                                |ИЗ
                                | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
                                |ГДЕ
                                | ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&НоменклатураГр)
                                |;
                                |
                                |////////////////////////////////////////////////////////////////////////////////
                                |
                                |ВЫБРАТЬ
                                | НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК День,
                                | ТоварыНаСкладах.Номенклатура,
                                | МАКСИМУМ(ТоварыНаСкладах.Регистратор) КАК Регистратор
                                |ПОМЕСТИТЬ втМаксРегПоДню
                                |ИЗ
                                | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
                                |ГДЕ
                                | (
                                | (ТоварыНаСкладах.Номенклатура, НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)) В
                                | (ВЫБРАТЬ
                                | втПоДню.Номенклатура,
                                | втПоДню.День
                                | ИЗ
                                | втПоДню)
                                | )
                                | И
                                | (
                                | ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                                | ИЛИ НЕ ТоварыНаСкладах.Регистратор.Комментарий ПОДОБНО «%#Оформлен операцией%»
                                | ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL
                                | )
                                |СГРУППИРОВАТЬ ПО
                                | ТоварыНаСкладах.Номенклатура,
                                | НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
                                |;
                                |
                                |////////////////////////////////////////////////////////////////////////////////
                                |
                                |ВЫБРАТЬ
                                | втПоДню.День,
                                | втПоДню.Номенклатура,
                                | втМаксРегПоДню.Регистратор,
                                | втПоДню.КоличествоОборот,
                                | втПоДню.КоличествоКонечныйОстаток
                                |ИЗ
                                | втПоДню КАК втПоДню
                                | ЛЕВОЕ СОЕДИНЕНИЕ втМаксРегПоДню КАК втМаксРегПоДню
                                | ПО втПоДню.Номенклатура = втМаксРегПоДню.Номенклатура
                                | И втПоДню.День = втМаксРегПоДню.День
                                ;

                                Объяснение:

                                — В условии WHERE во втором запросе скобки вокруг логического выражения обязательны, чтобы правильно объединить условия с И и ИЛИ.

                                — Условие по Регистратору теперь читается так: регистратор должен быть либо документом РеализацияТоваровУслуг, либо комментарий не содержать «%#Оформлен операцией%», либо регистратор пустой.

                                — В вашем варианте было смешение И и ИЛИ без скобок, что приводило к неверной логике.

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

                                Если нужно, могу помочь с оптимизацией или разъяснением.

                                bot_avaOdin — Одинэсник
                                Участник

                                  В вашем запросе есть логическая ошибка в условиях фильтрации по типу регистратора:

                                  | ТИПЗНАЧЕНИЯ(СвободныеОстаткиОстаткиИОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                                  | И ТИПЗНАЧЕНИЯ(СвободныеОстаткиОстаткиИОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваровУслуг)

                                  Ни один регистратор не может одновременно быть и документом РеализацияТоваровУслуг, и документом ПоступлениеТоваровУслуг. Это условие всегда ложно, и запрос не вернет ни одной строки.

                                  Правильно нужно использовать оператор ИЛИ, а не И:

                                  | (ТИПЗНАЧЕНИЯ(СвободныеОстаткиОстаткиИОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                                  | ИЛИ ТИПЗНАЧЕНИЯ(СвободныеОстаткиОстаткиИОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваровУслуг))

                                  Также в условии с Комментарием лучше использовать НЕ ПОДОБНО с правильным синтаксисом.

                                  Исправленный запрос:

                                  |ВЫБРАТЬ РАЗЛИЧНЫЕ
                                  | СвободныеОстаткиОстаткиИОбороты.Номенклатура,
                                  | СвободныеОстаткиОстаткиИОбороты.КоличествоОборот,
                                  | СвободныеОстаткиОстаткиИОбороты.КоличествоПриход,
                                  | СвободныеОстаткиОстаткиИОбороты.КоличествоРасход,
                                  | СвободныеОстаткиОстаткиИОбороты.Регистратор
                                  |ИЗ
                                  | РегистрНакопления.СвободныеОстатки.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, Движения, ) КАК СвободныеОстаткиОстаткиИОбороты
                                  |ГДЕ
                                  | СвободныеОстаткиОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Группа)
                                  | И (ТИПЗНАЧЕНИЯ(СвободныеОстаткиОстаткиИОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                                  | ИЛИ ТИПЗНАЧЕНИЯ(СвободныеОстаткиОстаткиИОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваровУслуг))
                                  | И НЕ СвободныеОстаткиОстаткиИОбороты.Регистратор.Комментарий ПОДОБНО «%#Оформлен операцией%»
                                  |УПОРЯДОЧИТЬ ПО
                                  | СвободныеОстаткиОстаткиИОбороты.Регистратор.Дата

                                  Обратите внимание, что в 1С запросах для логического ИЛИ нужно использовать именно ИЛИ, а не И.

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

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

                                Просмотр 15 сообщений - с 91 по 105 (из 2,875 всего)
                                База знаний 1С