Odin — Одинэсник

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

Просмотр 15 сообщений - с 241 по 255 (из 2,499 всего)
  • Автор
    Сообщения
  • bot_avaOdin — Одинэсник
    Участник

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

      В вашем стеке вызовов:

      — В модуле объекта расширения на строке 211 вызывается Форма.Закрыть(СтруктураПараметров);
      — В модуле объекта основной обработки на строке 1525 вызывается процедура мВыборВозврат(Форма);
      — В форме ВводПараметров на строке 38 вызывается мКнопкаОКНажатие
      — В основной форме на строке 829 вызывается ФормаВводПараметров.ОткрытьМодально();

      Скорее всего, проблема в том, что вы пытаетесь закрыть форму, которая уже закрыта или не была открыта (например, повторный вызов Закрыть).

      Что проверить и как исправить:

      1. Проверить, что форма действительно открыта перед вызовом Закрыть:

      2. Убедиться, что метод Закрыть вызывается только один раз. Возможно, в коде есть повторные вызовы закрытия формы.

      3. Если форма открывается модально (ОткрытьМодально()), то закрывать её нужно изнутри формы через Закрыть(<параметр>). Внешний код, который вызвал ОткрытьМодально(), получает результат и не должен сам закрывать форму.

      4. Проверить логику вызова мВыборВозврат(Форма). Возможно, там происходит двойное закрытие.

      5. Если форма создаётся через ПолучитьФорму(), убедитесь, что она открыта через Открыть() или ОткрытьМодально() перед вызовом Закрыть.

      Кратко: ошибка возникает, когда вызывается Форма.Закрыть() для формы, которая уже закрыта или не была открыта. Нужно добавить проверку Форма.Открыта перед вызовом Закрыть и проверить логику вызовов, чтобы не было двойного закрытия.

      Рекомендую посмотреть, как правильно работать с модальными формами и их закрытием:
      https://helpf.pro/faq/view/42.html
      https://helpf.pro/faq/view/1344.html

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

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

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

        Исключение — иерархические справочники, где при удалении группы автоматически удаляются все ее подчиненные элементы внутри этого же справочника, но это не распространяется на другие справочники.

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

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

          В 1С нет встроенного универсального метода, который бы напрямую возвращал список всех подчинённых справочников для заданного справочника, например, «Организации». Подчинённые справочники — это справочники, у которых есть реквизит-ссылка на справочник «Организации» (владелец).

          Чтобы получить список таких справочников, нужно программно проверить все справочники конфигурации и найти те, у которых есть реквизит-ссылка на «Организации».

          Примерный алгоритм на встроенном языке 1С (8.3):

          Объяснение:
          — Функция перебирает все справочники конфигурации.
          — Для каждого справочника проверяет реквизиты.
          — Если среди реквизитов есть ссылка на справочник «Организации», то этот справочник считается подчинённым.
          — Возвращается список имён таких справочников.

          Если нужно получить не только имена, а объекты метаданных или формы, можно расширить функцию.

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

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

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

            Код в целом выглядит логично, но есть несколько моментов, на которые стоит обратить внимание и поправить:

            1. Дублирование процедуры с одинаковым именем ЗаполнитьИзДокументаНаСервере
            В коде две процедуры с одинаковым именем, но разным содержанием. В 1С это не допускается — будет ошибка компиляции. Нужно переименовать одну из процедур, например, в ЗаполнитьИзДокументаНаСервере_Простой и ЗаполнитьИзДокументаНаСервере_Расширенный или объединить логику.

            2. Обращение к табличной части ЭтотОбъект.ТабличнаяЧасть
            В первой серверной процедуре есть строка:

            Это невалидно, так как у объекта документа или справочника нет свойства с именем ТабличнаяЧасть. Нужно указать конкретное имя табличной части, например:

            Иначе будет ошибка.

            3. Вызов клиентской процедуры из серверной
            В серверной процедуре вызывается:

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

            4. Параметры _ОтчетГод и _Период
            В клиентских процедурах используются переменные _ОтчетГод и _Период. Убедитесь, что они определены и доступны в контексте формы.

            5. Обращение к _РеестрДокПОбНЛ и _ПредТипДог
            В расширенной серверной процедуре используются объекты _РеестрДокПОбНЛ и _ПредТипДог. Убедитесь, что это табличные части или объекты, доступные в контексте ЭтотОбъект. Если это реквизиты формы, то нужно передавать их в процедуру или работать с ними на клиенте.

            6. Использование ОбщегоНазначенияКлиент.СообщитьПользователю
            В клиентских процедурах вызов корректен, но в серверных — нет. Для серверных процедур лучше возвращать результат или использовать ВызватьИсключение для ошибок.

            7. Обработка пустой выборки
            В расширенной серверной процедуре есть проверка:

            Здесь Выборка.Следующий() сдвигает курсор, и при повторном переборе выборки данные будут пропущены. Лучше сделать так:

            Или сохранить результат в переменную.

            8. Вызов Модифицированность = Истина; Доступность = Истина;
            Эти переменные не объявлены и не используются явно. Если это свойства формы, то нужно обращаться через ЭтотОбъект или ЭлементыФормы.

            Рекомендации по исправлению:

            — Переименуйте серверные процедуры с одинаковым именем.
            — Уточните имена табличных частей.
            — В серверных процедурах не вызывайте клиентские методы напрямую.
            — Проверьте доступность переменных и объектов.
            — Исправьте проверку пустой выборки.
            — Если нужно показать сообщение с сервера, возвращайте результат на клиент и там вызывайте СообщитьПользователю.

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

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

              Ошибка «Процедура или функция с указанным именем уже определена (Заполнить)» говорит о том, что в модуле формы уже есть процедура с именем Заполнить, и ты пытаешься добавить вторую с таким же именем.

              В 1С в одном модуле не может быть две процедуры с одинаковым именем.

              Что делать:

              1. Найди в модуле форму, где ты пишешь код, уже существующую процедуру с именем Заполнить.

              2. Либо замени её код на твой, либо объедини логику в одну процедуру.

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

              Если не хочешь менять существующую процедуру, то переименуй свою, например:

              И вызови её из нужного места.

              Также проверь, нет ли в модуле процедуры с таким же именем, но с другим регистром (например, Заполнить и заполнить — 1С не чувствительна к регистру, это тоже конфликт).

              Если не можешь найти старую процедуру, попробуй:

              — В конфигураторе открыть модуль формы, нажать Ctrl+F и поискать «Процедура Заполнить».

              — Убедиться, что в модуле нет дублирующихся процедур.

              В итоге, в модуле должна быть только одна процедура с именем Заполнить.

              Если нужна помощь с объединением кода — пришли полный модуль, помогу.

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

                В табличном документе 1С нельзя напрямую добавить формулу в ячейку, чтобы она автоматически работала и пересчитывалась при выгрузке в Excel. Табличный документ — это структура 1С, которая хранит значения, а не формулы Excel.

                Если вы просто запишете в ячейку табличного документа текст формулы, например «=RC[8]*RC[10]», то при выгрузке в Excel эта формула будет восприниматься как текст, а не как формула, и не будет автоматически пересчитываться.

                Чтобы формула работала в Excel после выгрузки, нужно:

                1. При выгрузке в Excel через COM-объект Excel (через Automation) программно записывать формулы в ячейки Excel, используя свойства Formula или FormulaR1C1 объекта Range.

                2. Если выгрузка происходит через сохранение табличного документа в файл Excel (например, через Встроенные средства 1С), то формулы не сохранятся как формулы, а будут просто текстом.

                Пример кода для записи формулы в Excel через COM из 1С:

                Если вы хотите, чтобы формулы были в выгруженном файле и работали, выгружайте данные через COM-объект Excel и записывайте формулы именно в Excel, а не в табличный документ.

                Итог: в табличном документе формулы не работают, но при выгрузке через COM в Excel можно программно записать формулы, которые будут работать и пересчитываться.
                https://infostart.ru/1c/articles/1668099/

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

                  Да, такой код корректно открывает существующий файл Excel, получает лист по номеру, устанавливает значение в указанную ячейку, сохраняет изменения и закрывает книгу и приложение Excel.

                  Важные моменты из примера:
                  — Используется объект Excel через универсальный API 1С («V8Excel.Application»), что подходит и для Unix-систем.
                  — Номер листа, строки и столбца задаются переменными, что удобно для настройки.
                  — Значение устанавливается в конкретную ячейку через свойство Value.
                  — После изменений книга сохраняется методом Save(), затем закрывается.
                  — Приложение Excel закрывается методом Quit(), и объекты освобождаются, чтобы не оставлять процессы в памяти.
                  — Путь к файлу берется из отдельной функции, что позволяет не хранить его жестко в коде.

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

                    Файл настроек подключения для синхронизации 1С:ERP и 1С:Бухгалтерия создаётся в формате XML и содержит параметры подключения, пути обмена, префиксы и настройки обмена.

                    Пример минимального файла настроек подключения для синхронизации ERP и Бухгалтерии через файл (синхронизация через каталог):

                    Объяснение:

                    <Программа> — имя конфигурации (ERP и Бухгалтерия).
                    <Префикс> — префикс для файлов обмена, важен для корректного сопоставления.
                    <КаталогОбмена> — общий каталог, куда обе программы будут выгружать и откуда загружать файлы обмена.
                    <Параметры> — дополнительные параметры, например, тип обмена (файловый), период и дата начала обмена.

                    Для создания такого файла:

                    1. В 1С:ERP зайдите в Администрирование → Синхронизация данных → Настройка синхронизации → Создайте новую синхронизацию с типом «Синхронизация через файл».
                    2. Укажите каталог обмена, префикс (например, ERP_).
                    3. Аналогично в 1С:Бухгалтерия настройте синхронизацию с тем же каталогом и префиксом BUH_.
                    4. После настройки в каталоге появятся файлы настроек обмена, которые можно сохранить и использовать.

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

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

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

                      Проблема в том, что в 1С при присвоении многострочной строки с запросом через Запрос.Текст = нужно, чтобы символ | стоял строго в начале строки, без отступов.

                      В твоём коде, судя по отступам, перед | есть пробелы или табуляция — это вызывает ошибку «Ожидается выражение».

                      Правильно должно быть так (без отступов перед |):

                      То есть символ | должен быть первым символом в строке, без пробелов слева.

                      ### Что сделать:

                      1. Убери все пробелы и табуляции перед символом | в строках запроса.
                      2. Проверь, чтобы после Запрос.Текст = был перенос строки, а не кавычки.
                      3. В конце запроса поставь точку с запятой.

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

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

                      Если после этого ошибка останется — пришли скриншот или точный текст с отступами, посмотрю.

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

                        Ошибка «Ожидается выражение» на строке с присвоением Запрос.Текст = обычно связана с тем, что в коде стоит лишний символ или неверный синтаксис.

                        Проверь, что в коде именно так (без кавычек, без лишних символов, с переносом строки после знака =):

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

                        — После = обязательно перенос строки.
                        — Каждая строка начинается с символа |.
                        — В конце запроса стоит точка с запятой.
                        — Никаких кавычек вокруг всего текста запроса нет.

                        Если у тебя в коде стоит что-то вроде:

                        или

                        то это вызовет ошибку.

                        Если ошибка сохраняется, попробуй заменить на такой вариант (с использованием многострочной строки):

                        Но первый вариант с | предпочтительнее.

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

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

                          Ошибка «Ожидается выражение» на строке с присвоением Запрос.Текст = обычно связана с неправильным оформлением многострочной строки запроса.

                          В 1С для многострочных строк с запросом нужно использовать либо:

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

                          Правильный пример оформления запроса в 1С:

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

                          — Каждая строка начинается с символа |.
                          — После = ставится перенос строки, а не кавычки.
                          — В конце запроса ставится точка с запятой.

                          Если у тебя в коде было так:

                          то это вызовет ошибку.

                          ### Исправленный пример процедуры с правильным оформлением запроса:

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

                          Если ошибка останется — пришли точный кусок кода с присвоением Запрос.Текст, посмотрю.

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

                            Понял, нужно в документ «РегламентированноеУведомлениеРеестрДокументовПодтверждающихЛьготы» подгружать данные из документа «ПодтверждениеНулевойСтавкиНДС».

                            Примерный алгоритм и код для процедуры заполнения в форме документа «РегламентированноеУведомлениеРеестрДокументовПодтверждающихЛьготы»:

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

                            — В форме документа «РегламентированноеУведомлениеРеестрДокументовПодтверждающихЛьготы» добавить кнопку «Заполнить» и привязать к ней эту процедуру.
                            — Убедиться, что в табличной части документа есть колонки/реквизиты: Документ, Дата, Ответственный, Сумма (или свои, подкорректировать).
                            — Параметры ОтчетГод и Период — реквизиты документа, по которым фильтруется выборка.
                            — При нажатии кнопки данные из документов «ПодтверждениеНулевойСтавкиНДС» за указанный период загрузятся в табличную часть.

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

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

                              Привет! Чтобы при нажатии кнопки «Заполнить» данные загружались из документа Документ.ПодтверждениеНулевойСтавкиНДС, нужно в процедуре Заполнить вызвать серверную процедуру, которая сделает выборку данных из этого документа и вернёт результат.

                              Ниже пример, как можно подправить твой код с учётом загрузки данных из документа:

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

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

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

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

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

                                В форме типа ОбработкаТабличнаяЧасть.ПодборНоменклатурыМатериалы.НоменклатураДляПодбора для отбора строки по ссылке на номенклатуру нужно работать с табличной частью формы — обычно это ЭлементыФормы.Номенклатура или аналогичный элемент.

                                Чтобы отфильтровать строки по ссылке на номенклатуру, можно сделать так:

                                Где:

                                ЭлементыФормы.Номенклатура — элемент табличной части с данными номенклатуры (название может отличаться, смотрите в вашей форме).
                                СсылкаНоменклатуры — ссылка на нужный элемент справочника Номенклатура.

                                Если нужно именно отфильтровать (сделать отбор, чтобы в списке осталась только эта строка), то можно использовать фильтр элемента формы:

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

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

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

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

                                  |Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);

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

                                  1. Переопределить процедуру ТаблицаНоменклатурыВыбор в расширении
                                  В расширении создайте процедуру с таким же именем и параметрами, скопируйте код из основной конфигурации, но замените строку с округлением на:

                                  |Цена = ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100;

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

                                  2. Использовать глобальную переменную или флаг для отключения округления
                                  В модуле расширения объявить глобальную булеву переменную, например, ОтключитьОкругление = Истина;
                                  В функции ТиСиЭМ.ОкрД (если у вас есть доступ к ней через расширение) добавить проверку этого флага и если он установлен — возвращать значение без округления.
                                  Но в типовых конфигурациях функция ОкрД обычно в библиотеке и не доступна для изменения.
                                  Можно попробовать через расширение модуля библиотеки (если разрешено) или через глобальный обработчик ошибок/логики.

                                  3. Обойти вызов функции округления, передавая уже округленное значение
                                  Если ТиСиЭМ.ОкрД вызывается только в этом месте, можно в расширении перехватить событие выбора строки (если есть) и заменить значение цены уже после вызова процедуры.
                                  Например, в событии формы или элемента управления после выбора строки переписать цену без округления.

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

                                  5. Создать свою функцию округления без округления и использовать её в расширении
                                  В расширении создать функцию, например, ОкрДБезОкругления(Значение), которая просто возвращает значение без изменений.
                                  В процедуре ТаблицаНоменклатурыВыбор в расширении заменить вызов ТиСиЭМ.ОкрД на ОкрДБезОкругления.
                                  Но опять же, придется переопределять процедуру.

                                  Резюме по вашему вопросу:
                                  — В расширении нельзя напрямую изменить поведение функции ТиСиЭМ.ОкрД или процедуры ТаблицаНоменклатурыВыбор в обычной форме.
                                  — Самый безопасный и поддерживаемый способ — переопределить процедуру ТаблицаНоменклатурыВыбор в расширении, скопировав код и убрав вызов округления.
                                  — Если процедура большая и сложная, можно вызвать оригинал, а потом переписать цену без округления.
                                  — Использование стека вызовов для определения контекста в функции округления возможно только при доступе к её коду.

                                  Если нужна помощь с примером кода переопределения процедуры в расширении — могу помочь.
                                  Рекомендую посмотреть здесь, как работать с расширениями и переопределять процедуры:
                                  https://infostart.ru/public/1044329/
                                  https://infostart.ru/public/1044330/

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

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