Почему кнопка из расширения 1С не видна пользователям, но работает в отладке, и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Коллеги, мы с вами нередко сталкиваемся с распространенной проблемой в разработке на платформе 1С:Предприятие, когда изменения, внесенные через расширения, корректно отображаются и функционируют в режиме отладки, но по неизвестным причинам не видны или недоступны конечным пользователям в продуктивном режиме. Рассмотрим ситуацию, описанную нашими коллегами на форуме 1С, и разберем пути ее решения.

Один из наших коллег столкнулся с такой проблемой: в конфигурации Управление торговлей 11.5 на платформе 8.3.20.1590 была добавлена новая кнопка в форму документа ЗаказПоставщику посредством расширения. В процессе отладки все работало безупречно, но в продуктивной среде у одних пользователей кнопка была недоступна (отображалась серым), а у других отсутствовала вовсе. Это классический пример ситуации, требующей нашего внимания и глубокого анализа причин.

Причины возникновения проблемы с отображением элементов расширения

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

Решение проблемы: Сброс пользовательских настроек формы

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

  1. Сброс настроек для отдельного пользователя

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

    1. Откройте проблемный документ (в нашем случае — ЗаказПоставщику) в режиме "1С:Предприятие".
    2. Нажмите на кнопку с изображением шестеренки или ссылку "Еще" (зависит от версии конфигурации и расположения командной панели) в правом верхнем углу формы документа.
    3. В выпадающем меню выберите пункт Изменить форму.... Откроется окно "Настройка формы".
    4. В окне "Настройка формы" нажмите кнопку Стандартные настройки. Платформа предложит подтвердить сброс пользовательских настроек формы. Подтвердите действие.

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

  2. Сброс настроек администратором (при необходимости массового сброса или если пользователь не может сделать это сам)

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

    1. Перейдите в раздел Администрирование -> Настройки пользователей и прав -> Настройки пользователей (или Персональные настройки пользователей, в зависимости от конфигурации).
    2. Найдите нужного пользователя в списке и откройте его карточку настроек.
    3. В карточке пользователя найдите и перейдите по ссылке Очистить настройки или Настройки форм (название может варьироваться в зависимости от конфигурации).
    4. В открывшемся списке сохраненных настроек найдите и удалите те, которые относятся к конкретной проблемной форме (например, "Форма документа ЗаказПоставщику") или, в крайнем случае, все сохраненные настройки форм для этого пользователя.

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

Другие потенциальные решения и рекомендации

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

Очистка кэша

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

  1. Очистка клиентского кэша

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

    1. Закройте все сеансы 1С на клиентском компьютере.
    2. В окне запуска 1С выберите информационную базу, с которой возникла проблема.
    3. Нажмите кнопку Изменить.
    4. На втором шаге настройки информационной базы измените путь к каталогу информационной базы, например, добавив любой символ в конце пути и затем удалив его, чтобы вызвать перестроение кэша. Или просто нажмите "Далее" и "Готово", если это не помогает.
    5. Более радикальный способ: вручную очистите каталоги кэша. Перейдите в системные папки, которые содержат кэш 1С:
      • %LOCALAPPDATA%\1C\1CE\
      • %APPDATA%\1C\1CE\

      В этих папках вы найдете подпапки с длинными буквенно-цифровыми именами (GUID), которые соответствуют вашим информационным базам. Удалите или переименуйте те папки, которые относятся к проблемной базе. Платформа 1С автоматически создаст их заново при следующем запуске.

  2. Очистка кэша на сервере 1С (для клиент-серверного варианта)

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

    1. Откройте Консоль администрирования серверов 1С:Предприятия.
    2. Найдите ваш кластер серверов и информационную базу.
    3. Для проблемной информационной базы можно выполнить очистку кэша через контекстное меню (обычно "Очистить кэш").
    4. В более сложных случаях или при отсутствии явной команды для очистки кэша, можно перезапустить проблемный рабочий процесс кластера серверов 1С, который обслуживает вашу информационную базу. Это гарантированно сбросит серверный кэш.

Программное создание элементов управляемой формы

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

Мы создаем элементы управляемой формы в обработчике события формы ПриСозданииНаСервере(). Для этого используем методы объекта Элементы (коллекция элементов формы): Элементы.Добавить() или Элементы.Вставить(). Давайте рассмотрим пример:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Проверяем, что кнопка еще не добавлена, чтобы избежать дублирования
    // Это важно, если расширение может быть применено несколько раз или
    // если элемент может быть добавлен другим расширением.
    Если Не Элементы.Есть("КнопкаМояНовая") Тогда

        // 1. Определяем местоположение для кнопки.
        // В нашем случае, это может быть какая-то существующая группа на форме.
        // Например, группа с важными действиями формы или командная панель.
        // Допустим, у нас есть группа 'ГруппаВажныхДействий' на форме.
        // Если такой группы нет, нам, возможно, придется создать ее программно
        // или найти другую подходящую группу.
        // Для примера, разместим в "ОсновнаяКоманднаяПанель" или в созданной нами группе.
        // Если мы хотим добавить кнопку в командную панель табличной части,
        // например, товаров, это будет "Элементы.ТоварыКоманднаяПанель".
        // Для простоты, допустим, мы хотим добавить ее в корневую командную панель,
        // или в специально созданную группу для кнопок расширения.

        // Для примера, добавим в какую-то условную группу или в корневой элемент
        // Лучше найти конкретную группу, например, "ГруппаКомандныеКнопки"
        // или "ОсновнаяКоманднаяПанель".

        // Найдем существующую группу, куда хотим добавить кнопку.
        // Если это командная панель формы, то:
        ЭлементКоманднаяПанель = Элементы.Найти("КоманднаяПанельФормы"); // Пример
        Если ЭлементКоманднаяПанель = Неопределено Тогда
            // Если такой панели нет или мы хотим создать свою группу
            ЭлементКоманднаяПанель = Элементы.Добавить("ГруппаКнопокРасширения", Тип("ГруппаФормы"), Элементы.Найти("ОсновнаяГруппаФормы"));
            ЭлементКоманднаяПанель.Вид = ВидГруппыФормы.ОбычнаяГруппа;
            ЭлементКоманднаяПанель.Заголовок = "Дополнительные действия";
        КонецЕсли;

        // 2. Создаем новый элемент - кнопку.
        // Первый параметр - имя элемента.
        // Второй параметр - тип элемента (Тип("Кнопка")).
        // Третий параметр - родительский элемент, куда будет добавлена кнопка.
        НоваяКнопка = Элементы.Добавить("КнопкаМояНовая", Тип("Кнопка"), ЭлементКоманднаяПанель);

        // 3. Устанавливаем свойства кнопки.
        НоваяКнопка.Заголовок = "Моя новая кнопка";
        НоваяКнопка.Вид = ВидКнопкиКоманднойПанели.ОбычнаяКнопка; // Может быть ОбычнаяКнопка, КнопкаМеню, Подменю
        НоваяКнопка.Положение = ПоложениеЭлементаУправления.Авто; // или другое, например, РядомСЛевымЭлементом

        // 4. Создаем команду для кнопки, если она не привязана к существующей команде.
        // Сначала создаем команду в коллекции команд формы:
        КомандаФормы = КомандыФормы.Добавить("МояНоваяКомандаРасширения");
        КомандаФормы.Представление = "Выполнить действие"; // Заголовок, который может отображаться в меню

        // 5. Привязываем команду к процедуре-обработчику на клиенте.
        КомандаФормы.Действие = "ВыполнитьДействиеКнопкиНаКлиенте";

        // 6. Привязываем кнопку к созданной команде.
        НоваяКнопка.Команда = КомандаФормы;

        // 7. Делаем кнопку видимой и доступной.
        НоваяКнопка.Видимость = Истина;
        НоваяКнопка.Доступность = Истина;

        // Если нам нужно добавить кнопку в командную панель табличной части,
        // например, табличной части "Товары", то это будет выглядеть так:
        // ЭлементКоманднаяПанельТовары = Элементы.Найти("Товары").ПодчиненныеЭлементы.Найти("КоманднаяПанель"); // Или другое имя
        // Если ЭлементКоманднаяПанельТовары <> Неопределено Тогда
        //     КнопкаТабЧасти = Элементы.Добавить("КнопкаТабЧасти", Тип("Кнопка"), ЭлементКоманднаяПанельТовары);
        //     КнопкаТабЧасти.Заголовок = "Действие с товарами";
        //     // ... и так далее, по аналогии ...
        // КонецЕсли;

    КонецЕсли;

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

&НаКлиенте
Процедура ВыполнитьДействиеКнопкиНаКлиенте(Команда)
    Сообщить("Кнопка из расширения нажата!");
    // Здесь мы можем вызвать серверную процедуру для выполнения основной логики:
    // ВыполнитьДействиеКнопкиНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьДействиеКнопкиНаСервере()
    // Основная логика обработки нажатия кнопки на сервере
    // Например, запись данных, изменение объектов и т.д.
    Сообщить("Действие выполнено на сервере!");
КонецПроцедура

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

Особенности платформы 8.3.20.1590

Наш коллега в сообщении 2 справедливо отметил, что именно в версии платформы 8.3.20.1590 могут наблюдаться такие "глюки". Хотя точные причины в данном контексте не были детализированы, факт наличия платформо-специфичных проблем не является редкостью. Платформа 1С постоянно развивается, и в каждой новой версии исправляются ошибки, оптимизируется работа расширений и добавляются новые функциональные возможности. Если у вас есть возможность, мы настоятельно рекомендуем рассмотреть обновление платформы до более свежих стабильных версий. Часто такие специфические проблемы исправляются в последующих релизах, и переход на новую версию может решить проблему без дополнительных усилий.

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

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

  1. Проверка активности расширения и режима его работы

    Убедитесь, что расширение активно и не находится в "безопасном режиме" без необходимых разрешений.

    1. Перейдите в раздел Администрирование -> Печатные формы, отчеты и обработки -> Расширения.
    2. Убедитесь, что ваше расширение включено (установлен флажок "Активно").
    3. Проверьте свойства расширения: нет ли там никаких предупреждений о небезопасном режиме, требующих дополнительных разрешений. Если расширение должно выполнять какие-либо действия, затрагивающие данные или системные функции, и оно находится в безопасном режиме, то его функционал будет ограничен. При необходимости (и если расширение доверенное) установите флажок Режим отладки или Использование небезопасных методов, чтобы разрешить расширению полный доступ к функционалу платформы.
  2. Настройка ролей и прав

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

    1. В конфигураторе откройте расширение.
    2. Проверьте, какие объекты расширения (документы, справочники, команды, роли) были добавлены или изменены.
    3. Если расширение вводит новые команды или формы, убедитесь, что роли, назначенные пользователям, имеют право на "Использование" этих команд или "Просмотр" соответствующих форм.
    4. При необходимости создайте новую роль в расширении с нужными правами и назначьте ее пользователям, или добавьте необходимые права к существующим ролям основной конфигурации через механизм расширений.

Влияние режима совместимости

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

Динамическое обновление

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

Заключение

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

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

  1. Очистка клиентского кэша: Начните с этого, так как это наименее инвазивный шаг и часто помогает.
  2. Сброс пользовательских настроек формы: Если очистка кэша не помогла, перейдите к сбросу настроек формы для проблемных пользователей.
  3. Проверка активности расширения и прав доступа: Убедитесь, что расширение включено и пользователю предоставлены все необходимые права.
  4. Рассмотрите программное создание элементов: В качестве профилактики подобных проблем в будущем, или если предыдущие шаги не дали результата, перейдите к программному созданию элементов формы.
  5. Обновление платформы: Если проблемы носят системный характер и связаны с конкретной версией платформы (как в случае 8.3.20.1590), рассмотрите возможность обновления до более стабильного и актуального релиза.

Такой системный и последовательный подход позволит нам быстро и эффективно решать возникающие сложности с отображением элементов расширений в 1С.

← На главную