В данной публикации приведены не те случаи, когда я могу однозначно говорить об ошибке конфигурации или платформы. Просто не всегда логика работы типового механизма мне понятна, и приходится искать обходные пути, чтобы решить нужную задачу.
Создание "пустых" партнеров в чеках ККМ
Столкнулись с той же проблемой, что и коллеги в https://forum.infostart.ru/forum81/topic175604/
В общем, не стоит ставить эту галочку, от нее один вред

Для исправления данных пришлось написать мини-обработку:
Процедура УбратьПустыхКлиентовИзЧековНаСервере()
Процедура УбратьПустыхКлиентовИзЧековНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЧекККМ.Ссылка КАК ЧекККМ,
| ЧекККМ.Партнер,
| ОтчетОРозничныхПродажах.Ссылка КАК ОтчетОРозничныхПродажах
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
| ПО ЧекККМ.КассоваяСмена = ОтчетОРозничныхПродажах.КассоваяСмена
| И (ОтчетОРозничныхПродажах.Проведен)
| И (ЧекККМ.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Пробит))
| И (ЧекККМ.Партнер.Наименование = """")
| И (ЧекККМ.Дата >= &НачалоПериода)
| И (ЧекККМ.Дата <= &КонецПериода)"
;
Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
ТЗЧеки = Запрос.Выполнить().Выгрузить();
ТЗОтчеты = ТЗЧеки.Скопировать(, "ОтчетОРозничныхПродажах");
ТЗОтчеты.Свернуть("ОтчетОРозничныхПродажах", "");
Для каждого стрТЗОтчеты Из ТЗОтчеты Цикл
Отб = Новый Структура("ОтчетОРозничныхПродажах", стрТЗОтчеты.ОтчетОРозничныхПродажах);
ТЗЧекиПоОтчету = ТЗЧеки.Скопировать(Отб);
МассивПартнеров = ТЗЧекиПоОтчету.ВыгрузитьКолонку("Партнер");
НачатьТранзакцию();
ОтчетОРозничныхПродажахОбъект = стрТЗОтчеты.ОтчетОРозничныхПродажах.ПолучитьОбъект();
Для каждого стрТовары Из ОтчетОРозничныхПродажахОбъект.Товары Цикл
Если МассивПартнеров.Найти(стрТовары.Партнер) <> Неопределено Тогда
стрТовары.Партнер = Справочники.Партнеры.РозничныйПокупатель;
КонецЕсли;
КонецЦикла;
ОтчетОРозничныхПродажахОбъект.Записать(РежимЗаписиДокумента.Проведение);
Для каждого стрТЗЧекиПоОтчету Из ТЗЧекиПоОтчету Цикл
ЧекККМОбъект = стрТЗЧекиПоОтчету.ЧекККМ.ПолучитьОбъект();
Партнер = ЧекККМОбъект.Партнер;
ЧекККМОбъект.Партнер = Справочники.Партнеры.РозничныйПокупатель;
ЧекККМОбъект.ОбменДанными.Загрузка = Истина;
ЧекККМОбъект.Записать();
ПартнерОбъект = Партнер.ПолучитьОбъект();
ПартнерОбъект.УстановитьПометкуУдаления(Истина);
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецЦикла;
КонецПроцедуры
Обработка дополнительно приложена к публикации.
Печать отложенных чеков
С появлением онлайн-ККТ эта проблема уже не так актуальна, но все же может возникнуть. Суть в том, что в РМК УТ 11 есть возможность откладывать Чек ККМ, открыть отложенный Чек ККМ, распечатывать товарный чек, а потом удалять отложенный чек. Кассиры могут случайно или умышленно воспользоваться этой возможностью.

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

Эта ошибка вызовет проблему в том случае, если при пробитии чека ККМ возникнет отказ или ошибка - чек будет в состоянии "отложен". Если его повторно открыть, то система без проблем даст внести еще раз оплату картой (что обычно и проделывают кассиры), и добавит эту оплату к уже проведенной.
Там есть операция отмены оплаты платежной картой, но чек спокойно проводится при превышении суммы оплаты над суммой чека.
Исправляется довольно просто. В справочнике "ПодключаемоеОборудование" в форме "ФормаАвторизацииЭТ" в процедуре "ПриСозданииНаСервере"
&НаСервере
Процедура ECom_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
времПределСуммы = 0;
Если Не (Параметры.Свойство("ПределСуммы", времПределСуммы)
И времПределСуммы > 0) Тогда
Элементы.Сумма.МаксимальноеЗначение = 0;
КонецЕсли;
КонецПроцедуры
Ошибка в указании вида оплаты при проведении возврата
Бывает ситуация, когда ЧекККМ был пробит с видом оплаты по карте, а при оформлении возврата в ту же смену документом ЧекККМНаВозврат кассир ошибочно проводит возврат оплаты наличными. Конфигурация УТ11 этому никак не препятствует. Но бухгалтеры требуют, чтобы возврат пробивался с тем же видом оплаты, что и покупка - таковы правила использования ККТ.
Та же самая ситуация при оформлении возврата в другую смену. Конфигурация не мешает провести Расходный кассовый ордер и Операцию по платежной карте на "неправильные" суммы. Можно поставить такой запрет с помощью вот этого кода:
Модуль формы "ФормаДокументаРМК" документа "ЧекККМНаВозврат"
&НаСервере
Функция ECom_ПроверитьОплатуНалБезнал()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(Чеки.СуммаБезнал) КАК СуммаБезнал,
| СУММА(Чеки.СуммаДокумента) КАК СуммаДокумента
|ИЗ
| (ВЫБРАТЬ
| СУММА(ЕСТЬNULL(ЧекККМОплатаПлатежнымиКартами.Сумма, 0)) КАК СуммаБезнал,
| ЧекККМ.СуммаДокумента КАК СуммаДокумента
| ИЗ
| Документ.ЧекККМ КАК ЧекККМ
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ЧекККМОплатаПлатежнымиКартами
| ПО (ЧекККМОплатаПлатежнымиКартами.Ссылка = ЧекККМ.Ссылка)
| ГДЕ
| ЧекККМ.Ссылка = &ЧекККМ
|
| СГРУППИРОВАТЬ ПО
| ЧекККМ.СуммаДокумента
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| СУММА(-ЕСТЬNULL(ЧекККМВозвратОплатаПлатежнымиКартами.Сумма, 0)),
| -ЧекККМВозврат.СуммаДокумента
| ИЗ
| Документ.ЧекККМВозврат КАК ЧекККМВозврат
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМВозврат.ОплатаПлатежнымиКартами КАК ЧекККМВозвратОплатаПлатежнымиКартами
| ПО (ЧекККМВозвратОплатаПлатежнымиКартами.Ссылка = ЧекККМВозврат.Ссылка)
| И (ЧекККМВозвратОплатаПлатежнымиКартами.ОплатаОтменена)
| ГДЕ
| ЧекККМВозврат.ЧекККМ = &ЧекККМ
| И ЧекККМВозврат.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Пробит)
|
| СГРУППИРОВАТЬ ПО
| -ЧекККМВозврат.СуммаДокумента) КАК Чеки"
;
Запрос.УстановитьПараметр("ЧекККМ", Объект.ЧекККМ);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СуммаКартамиВЧеке = Выборка.СуммаБезнал;
СуммаНаличнымиВЧеке = Выборка.СуммаДокумента - Выборка.СуммаБезнал;
Иначе
СуммаКартамиВЧеке = 0;
СуммаНаличнымиВЧеке = 0;
КонецЕсли;
Отб = Новый Структура("ОплатаОтменена", Истина);
ТЗОплатаПлатежнымиКартами = Объект.ОплатаПлатежнымиКартами.Выгрузить(Отб);
СуммаКартамиВВозврате = ТЗОплатаПлатежнымиКартами.Итог("Сумма");
СуммаНаличнымиВВозврате = Объект.Товары.Итог("Сумма") - СуммаКартамиВВозврате;
ЕстьОшибки = Ложь;
ТекстОшибки = "";
Если СуммаКартамиВВозврате > СуммаКартамиВЧеке Тогда
ТекстОшибки = "Сумма оплаты картами в возврате " + Формат(СуммаКартамиВВозврате, "ЧН=Отсутствует; ЧГ=0") +
" превышает сумму оплаты картами в чеке (за вычетом сделанных возвратов) " + Формат(СуммаКартамиВЧеке, "ЧН=Отсутствует; ЧГ=0") +
". Откорректируйте оплату наличными и картами через возврат смешанной оплаты.";
ЕстьОшибки = Истина;
КонецЕсли;
Если СуммаНаличнымиВВозврате > СуммаНаличнымиВЧеке Тогда
ТекстОшибки = ?(ЗначениеЗаполнено(ТекстОшибки), ТекстОшибки + Символы.ПС, "") +
"Сумма оплаты наличными в возврате " + Формат(СуммаНаличнымиВВозврате, "ЧН=Отсутствует; ЧГ=0") +
" превышает сумму оплаты наличными в чеке (за вычетом сделанных возвратов) " + Формат(СуммаНаличнымиВЧеке, "ЧН=Отсутствует; ЧГ=0") +
". Откорректируйте оплату наличными и картами через возврат смешанной оплаты.";
ЕстьОшибки = Истина;
КонецЕсли;
Если ЕстьОшибки Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, Объект.Ссылка,,, ЕстьОшибки);
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции // ECom_ПроверитьОплатуБезнал()
&НаКлиенте
&Вместо("ПробитьЧек")
Процедура ECom_ПробитьЧек()
Модифицированность = Истина;
Если ECom_ПроверитьОплатуНалБезнал() Тогда
ПродолжитьВызов();
КонецЕсли;
КонецПроцедуры
Модуль документа "РасходныйКассовыйОрдер"
&После("ОбработкаПроведения")
Процедура ECom_ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЖурналФискальныхОпераций.ДокументОснование КАК РКО
|ПОМЕСТИТЬ ЖурналФискальныхОпераций
|ИЗ
| РегистрСведений.ЖурналФискальныхОпераций КАК ЖурналФискальныхОпераций
|ГДЕ
| ЖурналФискальныхОпераций.ДокументОснование = &РКО
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЧекККМДок.Ссылка КАК ЧекККМ
|ИЗ
| Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМДок
| ПО ВозвратТоваровОтКлиента.ЧекККМ = ЧекККМДок.Ссылка
| И (ВозвратТоваровОтКлиента.Ссылка = &ДокументОснование)
| И (НЕ &РКО В
| (ВЫБРАТЬ
| ЖурналФискальныхОпераций.РКО
| ИЗ
| ЖурналФискальныхОпераций КАК ЖурналФискальныхОпераций))"
;
Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
Запрос.УстановитьПараметр("РКО", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЧекККМ = Выборка.ЧекККМ;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(Чеки.СуммаБезнал) КАК СуммаБезнал,
| СУММА(Чеки.СуммаДокумента) КАК СуммаДокумента
|ИЗ
| (ВЫБРАТЬ
| СУММА(ЕСТЬNULL(ЧекККМОплатаПлатежнымиКартами.Сумма, 0)) КАК СуммаБезнал,
| ЧекККМ.СуммаДокумента КАК СуммаДокумента
| ИЗ
| Документ.ЧекККМ КАК ЧекККМ
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ЧекККМОплатаПлатежнымиКартами
| ПО (ЧекККМОплатаПлатежнымиКартами.Ссылка = ЧекККМ.Ссылка)
| ГДЕ
| ЧекККМ.Ссылка = &ЧекККМ
|
| СГРУППИРОВАТЬ ПО
| ЧекККМ.СуммаДокумента
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| СУММА(-ЕСТЬNULL(ЧекККМВозвратОплатаПлатежнымиКартами.Сумма, 0)),
| -ЧекККМВозврат.СуммаДокумента
| ИЗ
| Документ.ЧекККМВозврат КАК ЧекККМВозврат
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМВозврат.ОплатаПлатежнымиКартами КАК ЧекККМВозвратОплатаПлатежнымиКартами
| ПО (ЧекККМВозвратОплатаПлатежнымиКартами.Ссылка = ЧекККМВозврат.Ссылка)
| И (ЧекККМВозвратОплатаПлатежнымиКартами.ОплатаОтменена)
| ГДЕ
| ЧекККМВозврат.ЧекККМ = &ЧекККМ
| И ЧекККМВозврат.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Пробит)
|
| СГРУППИРОВАТЬ ПО
| -ЧекККМВозврат.СуммаДокумента
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| 0,
| СУММА(-РасходныйКассовыйОрдер.СуммаДокумента)
| ИЗ
| Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
| ГДЕ
| РасходныйКассовыйОрдер.ДокументОснование = &ДокументОснование
| И РасходныйКассовыйОрдер.Проведен
| И РасходныйКассовыйОрдер.Ссылка <> &РКО) КАК Чеки"
;
Запрос.УстановитьПараметр("ЧекККМ", ЧекККМ);
Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
Запрос.УстановитьПараметр("РКО", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОплатаПокупкиНаличными = Выборка.СуммаДокумента - Выборка.СуммаБезнал;
Иначе
ОплатаПокупкиНаличными = 0;
КонецЕсли;
ОплатаВозвратаНаличными = РасшифровкаПлатежа.Итог("Сумма");
Если ОплатаВозвратаНаличными > ОплатаПокупкиНаличными Тогда
ТекстОшибки = "Сумма РКО " + Формат(ОплатаВозвратаНаличными, "ЧН=Отсутствует; ЧГ=0") +
" превышает сумму оплаты наличными в чеке (за вычетом сделанных возвратов) " + Формат(ОплатаПокупкиНаличными, "ЧН=Отсутствует; ЧГ=0");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, Ссылка,,, Отказ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Модуль документа "ОперацияПоПлатежнойКарте"
&После("ОбработкаПроведения")
Процедура ECom_ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЖурналФискальныхОпераций.ДокументОснование КАК ПлатежныйДокумент
|ПОМЕСТИТЬ ЖурналФискальныхОпераций
|ИЗ
| РегистрСведений.ЖурналФискальныхОпераций КАК ЖурналФискальныхОпераций
|ГДЕ
| ЖурналФискальныхОпераций.ДокументОснование = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЧекККМДок.Ссылка КАК ЧекККМ
|ИЗ
| Документ.ВозвратТоваровОтКлиента КАК ВозвратТоваровОтКлиента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМДок
| ПО ВозвратТоваровОтКлиента.ЧекККМ = ЧекККМДок.Ссылка
| И (ВозвратТоваровОтКлиента.Ссылка = &ДокументОснование)
| И (НЕ &Ссылка В
| (ВЫБРАТЬ
| ЖурналФискальныхОпераций.ПлатежныйДокумент
| ИЗ
| ЖурналФискальныхОпераций КАК ЖурналФискальныхОпераций))"
;
Запрос.УстановитьПараметр("ДокументОснование", РасшифровкаПлатежа[0].Заказ);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЧекККМ = Выборка.ЧекККМ;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(Чеки.СуммаБезнал) КАК СуммаБезнал
|ИЗ
| (ВЫБРАТЬ
| СУММА(ЕСТЬNULL(ЧекККМОплатаПлатежнымиКартами.Сумма, 0)) КАК СуммаБезнал
| ИЗ
| Документ.ЧекККМ КАК ЧекККМ
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ЧекККМОплатаПлатежнымиКартами
| ПО (ЧекККМОплатаПлатежнымиКартами.Ссылка = ЧекККМ.Ссылка)
| ГДЕ
| ЧекККМ.Ссылка = &ЧекККМ
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| СУММА(-ЕСТЬNULL(ЧекККМВозвратОплатаПлатежнымиКартами.Сумма, 0))
| ИЗ
| Документ.ЧекККМВозврат КАК ЧекККМВозврат
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМВозврат.ОплатаПлатежнымиКартами КАК ЧекККМВозвратОплатаПлатежнымиКартами
| ПО (ЧекККМВозвратОплатаПлатежнымиКартами.Ссылка = ЧекККМВозврат.Ссылка)
| И (ЧекККМВозвратОплатаПлатежнымиКартами.ОплатаОтменена)
| ГДЕ
| ЧекККМВозврат.ЧекККМ = &ЧекККМ
| И ЧекККМВозврат.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Пробит)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| СУММА(-ОперацияПоПлатежнойКартеРасшифровкаПлатежа.Сумма)
| ИЗ
| Документ.ОперацияПоПлатежнойКарте.РасшифровкаПлатежа КАК ОперацияПоПлатежнойКартеРасшифровкаПлатежа
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОперацияПоПлатежнойКарте КАК ОперацияПоПлатежнойКарте
| ПО ОперацияПоПлатежнойКартеРасшифровкаПлатежа.Ссылка = ОперацияПоПлатежнойКарте.Ссылка
| И (ОперацияПоПлатежнойКарте.Проведен)
| И (ОперацияПоПлатежнойКарте.Ссылка <> &Ссылка)
| И (ОперацияПоПлатежнойКартеРасшифровкаПлатежа.Заказ = &ДокументОснование)) КАК Чеки"
;
Запрос.УстановитьПараметр("ЧекККМ", ЧекККМ);
Запрос.УстановитьПараметр("ДокументОснование", РасшифровкаПлатежа[0].Заказ);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОплатаПокупкиБезнал = Выборка.СуммаБезнал;
Иначе
ОплатаПокупкиБезнал = 0;
КонецЕсли;
ОплатаВозвратаБезнал = РасшифровкаПлатежа.Итог("Сумма");
Если ОплатаВозвратаБезнал > ОплатаПокупкиБезнал Тогда
ТекстОшибки = "Сумма эквайринговой операции " + Формат(ОплатаВозвратаБезнал, "ЧН=Отсутствует; ЧГ=0") +
" превышает сумму оплаты безналом в чеке (за вычетом сделанных возвратов) " + Формат(ОплатаПокупкиБезнал, "ЧН=Отсутствует; ЧГ=0");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, Ссылка,,, Отказ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Пробитие чека ККМ через РМК при открытой форме списка чеков
Если будет открыта форма списка чеков ККМ и одновременно РМК, то при пробитии чека программа будет надолго задумываться (если чеков много). Особенно весело, что она это делает два раза - перед вводом оплаты и непосредственно при пробитии. Проблемная строка вот эта, в форме списка чеков ККМ:
&НаКлиенте
Процедура УстановитьДоступностьКомандСозданияДокументовНаВозврат()
Если СтруктураСостояниеКассовойСмены = Неопределено И ЗначениеЗаполнено(КассаККМ) Тогда
ОбновитьСостояниеКассовойСменыИУстановитьОтборДинамическихСписковНаКлиенте(КассаККМ);
КонецЕсли;
ТекущиеДанные = Элементы.ЧекиККМ.ТекущиеДанные;
Видимо, при записи чека вызывается оповещение, которое вызывает и эту процедуру. Но почему такая простая конструкция вызывает тормоза именно при записи чека, а при простом открытии формы списка чеков не вызывает - мне сходу не понятно.
Еще через журнал чеков ККМ можно создать чек по "чужой" ККМ, которая не относится к текущему рабочему месту, что тоже может добавить веселья для сети магазинов.
Повторное пробитие чеков ККМ
Оказалось, что если пробитый чек ККМ открыть в обработке РМК (например, программно), то его вполне успешно можно менять и пробивать заново. Т.е. единственная защита от изменения пробитых чеков состоит в том, что УТ-шка при открытии документа выбирает нужную форму документа.
Периодическое "слетание" текущего рабочего места кассира
Этот вопрос пока подробно не исследовал, но было замечено, что иногда в 1С слетает привязка элемента справочника "Рабочее место" к текущему компьютеру. Наблюдается в тонком клиенте. Как следствие, слетает все торговое оборудование, надо прописывать заново. Особенно весело, если это происходит посреди смены. УТ11 при смене фискального устройства требует заново открыть смену. А предыдущие пробитые чеки остаются в "старой" смене, и приходится потом их перетаскивать.
Реализация в пути
Невозможно в списке реализаций установить отбор по реализациям "в пути" - это значение статуса не выбирается в отборе, доступно только значение "Реализовано"

Приходится для отбора использовать признак сравнения "не равно".
Кроме этого обнаружился косяк - при обмене с Бухгалтерией 3.0 реализации "в пути" выгружаются, но не загружаются в Бухгалтерию, вызывая ошибку. Мы отключили реализации "в пути" в правилах регистрации, хотя в общем случае это не подходит, конечно.
Перепроведение по видам запасов
Для повторного заполнения ТЧ "Виды запасов" у проведенного документа необходимо в доп. свойства объекта при проведении добавлять
Объект.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина);
Для этого можно воспользоваться обработкой "Групповое изменение реквизитов", закладка "Выполнить произвольный алгоритм"

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

Но это полбеды, а проблема в том, что перестают работать подписки на события, которые отрабатывают события, связанные с этим планом обмена. А значит становится невозможно записать любой объект, включенный в состав этого плана обмена.

Выгрузка безналичных розничных оплат в Бухгалтерию
При обмене не совсем корректно происходит обработка возвратов безналичных оплат в ту же смену. В УТ11 в ТЧ "Товары" информация о покупке не попадает, а вот в ТЧ "Оплата картами" есть и приход, и расход. При попадании в Бухгалтерию отчет о розничных продажах не проводится из-за того, что возврат оплаты по безналу требует строки в возврате покупки, а ее нет.

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

Для "лечения" этой особенности решили сворачивать оплаты по безналу при выгрузке из УТ11, для этого отредактировали обработчик Документ_ОтчетОРозничныхПродажах_Отправка в модуле менеджера обмена:
Обработчик "При отправке"
//EComIntegrator
//В Бухгалтерии строки возвратов оплаты картой обрабатываются по-другому, не как в УТ 11, из-за этого возникает ошибка проведения документа
ТабОплатаКартами.Свернуть("НомерКарты,ВидКарты,БанковскийСчетОрганизации,Номер,Ссылка,Эквайрер", "СуммаОплаты");
МассивСтрокДляУдаления = Новый Массив;
Для Каждого Строка Из ТабОплатаКартами Цикл
Если Строка.СуммаОплаты = 0 Тогда
МассивСтрокДляУдаления.Добавить(Строка);
КонецЕсли;
КонецЦикла;
Для Каждого Строка из МассивСтрокДляУдаления Цикл
ТабОплатаКартами.Удалить(Строка);
КонецЦикла;
Если ТабОплатаКартами.Количество() > 0 Тогда
//Типовой код выгрузки ТабОплатаКартами
КонецЕсли;
Добавление формы с динамическим списком в расширение
Наверное, это можно отнести скорее к особенностям платформы. Если добавить форму с динамическим списком в расширение, нажать там редактирование списка, а там - конструктор запроса, то при сохранении запроса сбиваются привязки полей формы к данным динамического списка. Но это полбеды, привязки можно восстановить. Но сбиваются какие-то более тонкие настройки, я не разобрался еще какие. В результате например при вызове процедуры
Источник.ДанныеСтроки(ВыделеннаяСтрока);
в данные попадают не все поля. У меня в динамическом списке чеков ККМ не попало поле Ссылка, и соответственно конфигурация начинает "глючить". А вот если не пользоваться конструктором запроса, а редактировать запрос чисто вручную - отрабатывает нормально, и ничего не слетает.
Видимость общих модулей в расширении
Для меня весьма таинственный и неприятный глюк. Берем функцию из модуля менеджера какого-либо объекта, добавляем в расширение (вызов "Вместо"). Теперь если в этой функции в расширении сделать вызов общего серверного модуля, выходит ошибка синтаксического контроля - якобы компилятор не видит этот модуль. Хотя этот же вызов используется в той же функции в "типовом" модуле менеджера. Пример
ТекстЗапросаПодарочныеСертификаты
&Вместо("ТекстЗапросаПодарочныеСертификаты")
Функция ECom_ТекстЗапросаПодарочныеСертификаты(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ПодарочныеСертификаты";
//Если Не ПроведениеСерверУТ.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
// Возврат "";
//КонецЕсли;
УстановитьПараметрыЗапросаКоэффициентыВалют(Запрос);
ТекстЗапроса =
"ВЫБРАТЬ
| &Период КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| ТабличнаяЧасть.ПодарочныйСертификат КАК ПодарочныйСертификат,
| ТабличнаяЧасть.Сумма КАК Сумма,
| ТабличнаяЧасть.Сумма * &КоэффициентПересчетаВВалютуРегл КАК СуммаРегл
|ИЗ
| Документ.РеализацияПодарочныхСертификатов.ПодарочныеСертификаты КАК ТабличнаяЧасть
|ГДЕ
| ТабличнаяЧасть.Ссылка = &Ссылка
| И &ЧекПробит";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Закомментированный участок вызывает ошибку. Благо, в данном случае он не влияет на логику алгоритма. Что интересно, этот глюк может "мешать" в самых неожиданных местах. Например, ошибка "модуль не найден" вылетает при просмотре журнала регистрации с "измененным" объектом.
Эту особенность удалось обойти с помощью конструкции "Выполнить", если "проблемный" участок кода поместить в "Выполнить".
Правильный способ решения вопроса подсказал eden: необходимо весь модуль менеджера и объекта в расширении заключать в конструкцию
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#КонецЕсли
Как это сделано в типовых модулях конфигураций.
Изменение состава плана обмена в расширении
Можно добавить план обмена в расширение. Можно нажать "Состав" и натыкать галочек на тех объектах, которые хочется добавить в состав плана обмена. Но толку от этого не будет, регистрацию изменений этих объектов в плане обмена провести не удастся.
Добавление новых объектов в расширение
При добавлении новых объектов в расширение, например общих команд, необходимо не забывать включать эти объекты в роли (типовые, или созданные в расширении)
Просмотр временных таблиц в отладчике
Блин, а что - так можно было?..
Запрос.МенеджерВременныхТаблиц.Таблицы[Индекс].ПолучитьДанные().Выгрузить()
Команды в интерфейсе - как это найти в конфигураторе для отладки
Определить, какой объект в конфигурации запускается при запуске той или иной команды в меню, можно с помощью "Замера производительности". Там выходит полный список всего, что происходит, и можно понять, что было запущено - команда, обработка, или форма справочника например.
Еще с помощью замера производительности удобно искать место в конфигурации, где генерируется ошибка с тем или иным текстом. Потому как через отладчик иногда не реально пройти по десяткам функций до места ошибки.
Отображение на форме взаимозависимых таблиц
Бывает необходимо, чтобы на форме какая-либо таблица заполнялась автоматически при выделении пользователем строки другой таблицы.
Для этого используется событие "При активизации строки" таблицы. Если внутри обработчика этого события мы будем как-то изменять элементы формы (например, менять видимость/доступность), то будет вызвана перерисовка формы, и как следствие - повторный вызов обработчика "При активизации строки". Таким образом, обработчик может уйти в "бесконечный цикл".
Для обхода этой особенности в реквизиты формы добавил переменную, которая хранит текущее значение выбранной строки таблицы, чтобы не вызывать повторное изменение элементов в обработчике "при активизации" при повторном заходе, и "разорвать" бесконечный цикл.
Подставить в запрос кусок текста
Оказывается, в запрос вместо параметра &Параметр можно подставлять произвольный кусок текста, не обязательно значение. Иногда требуется заложить некоторую универсальность в текст запроса, но при этом не хочется уходить от конструктора. Думаю, этот способ может пригодиться.
Обход строк динамического списка (например, с отборами)
Уличная магия от 1С
&НаСервере
Процедура СписокВТЗнаСервере()
Схема = Элементы.ТаблицаНаФорме.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.ТаблицаНаФорме.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Указанные ситуации воспроизведены на УТ 11.4.3.144, платформа 8.3.11.3034
Буду рад вашим дополнениям в комментариях о новых неожиданностях и путях обхода.