VirtualBox устраняем тормоза Ubuntu

Основной того, что тормозит Ubuntu на VirtualBox является отсутствие драйвера видеокарты на виртуальной машине. По идее, для решения этой проблемы вместе с VB поставляется диск дополнений. Однако, он не всегда решает проблему, и устанавливать приходится вручную. Сделать это просто, выполнив команду

sudo apt-get install virtualbox-guest-additions.iso virtualbox-guest-dkms virtualbox-guest-x11 virtualbox-guest-utils

Colored with dumpz.org

Получить md5 суммы всех файлов в каталоге

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

find /mnt/files -type f -exec md5sum {} \; >mdsums.log

Colored with dumpz.org

find

/mnt/files каталог поиска

-type f только файлы

-exec выполнить команду

{} очередной файл

>mdsums.log сохранить вывод в файл mdsums.log

Управление виртуальными хостами на Ubuntu LAMP

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

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

Для этого используется 2 команды a2ensite и a2dissite которые соответственно включают сайт и отключают его

Фактически происходит следующее:

При старте apache сканирует каталог sites-enabled и все, что там находится подключает как виртуальные хосты. 

Команда a2ensite создает символическую ссылку в каталоге sites-enabled на файл в каталоге sites-available, тогда как команда a2dissite удаляет символическую ссылку

Как это работает

  • Копируем файл 000-default.conf
    cp ./000-default.conf ./myhost.loc.conf
  • Редактируем файл myhost.loc.conf
    <VirtualHost *:80>
    ServerAdmin admin@myhost.loc
    DocumentRoot /path/to/site/root/public
    ServerName myhost.loc
    <Directory /path/to/site/root/public>
    AllowOverride All
    Require all granted
    Order allow,deny
    Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error_myhost.loc.log
    CustomLog ${APACHE_LOG_DIR}/access_myhost.loc.log combined
    </VirtualHost>

    Colored with dumpz.org

  • Активируем сайт
    sudo a2ensite myhost.loc.conf
  • При необходимости отключаем сайт
    sudo a2dissite myhost.loc.conf
  • Обновляем конфигурацию
    sudo service apache2 reload

Отчет о первом мотодальняке

Сегодня приехал из своего первого мотопутешествия. Маршрут был Астана-Актобе с ночевкой в Костанае и обратно, по истечению отпуска

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

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

Из подготовительных операций были:

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

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

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

Вот набор для ремонта шин вещь нужная, ибо мало кто возит его с собой, 

Так же взял с собой запас топлива. На случай, если обсохну в дали от бензоколонки.

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

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

Итак, последний рабочий день, вечером последние сборы и навьючивание мотоцикла. Отключение квартиры от основных коммуникаций (вода, газ). Электричество отключать не стал, т.к. работало видеонаблюдение (использовал старые смартфоны, подключенные к сервису ivideon), и лег спать. По плану подъем в 5 утра и выезд.

Не тут то было. Проснулся в 7. Пока собрался и выехал, стало 8. Ну не беда. ПОЕХАЛИ!!!

Сразу после выезда из Астаны попал под две небольшие полосы дождя. Меня это насторожило, но напрасно. Сильно на меня не лило больше, хотя и попадались достаточно протяженные участки мокрой дороги что заставляло сбрасывать скорость до 70-80 км/ч с крейсерных 130-150ти.

Останавливаться приходилось каждые 150-200 км, т.к. тело отекало а булки требовали разминки. Все с непривычки. В остальном до Костаная добрался без приключений и в 5 вечера уже заезжал в гостиницу. Там ужин, бокал пивасика и спать

За ужином в гостинице

Настало утро. В половине 6го утра уже грелся байк

20180722_052325

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

На выезде из города я догнал странный камаз. Пока я шел в далеке, он нормально себе ехал. Стоило мне начать его догонять, как он выезжал на обочину, поднимая столб пыли. А между тем, скорость наша была км. 60-70, а дорога четырех полосная.

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

Однако осадок остался.

Ну вот я выехал из Костаная. Позади Рудный и Тобол. А впереди Денисовка. Вот тут то и началось приключение.

Кочка на кочке, яма на яме, причем в шахматном порядке. Фиг объедешь. И на каждой яме задний аморт пробивается. А тут еще 10 литров бензы 2м номером рулить мешают. И вот, на очередной яме, заднее колесо уже не возвращается в свое положение, а мот скользит на пузе, вернее, на центральной подставке. Остановился. Поставил на боковую подножку, и отвернулся посмотреть, ничего ли не валяется на земле. Вроде бы нет. Поворачиваюсь к моту, а он лежит на правом боку. Беда-печаль. Поднимаю. Отломило подножку и рычаг тормоза. Решаю поставить на центральную подножку, но сил не хватает, ибо колесо просело, хвост опустился, а тут еще груз на мотоцикле. Подъезжаю к какой то яме, опускаю туда боковую ножку. Мот встал. Падать вроде не собирается. Разгрузил мот, но сил все еще не хватает. Торможу машину, и прошу помочь. Все. Мот на центральной подножке, которая при пузотерке еще и погнулясь. Пришлось под одну лапку подложить камень.

Стою, чешу репу. До Актобе еще 500 с лишним км. Решаю посмотреть, что же все таки случилось.

Достаю ключи, снимаю пластик, подножку, и боковую подставку. Моему взору открывается чудесная картина. Нижнее крепление амортизатора отломилось от рамы. Все. Приехал.

20180722 202440

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

20180722_202444

Так что я думаю что даже не плохо, что обломилась она у меня именно сейчас, на малой скорости. Потому что боюсь даже представить, что бы случилось, сломайся она у мена на скорости, скажем, км. 150-200 в час. Конечно, телега, и скорее всего ничего бы, кроме тонны кирпичей не было бы. Но это я так себя успакаиваю.

Ну думаю, примотаю на проволоку. Беда только, нет ее у меня. Начинаю тормозить тачки. Практически каждая останавливается. Но нужного материала ни у кого нет.

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

Впереди 500 км. до Актобе. 

Водитель, дядя Вова, душевный мужик. Всю дорогу с ним проговорили. Не молчали ни минуты ) Благодарность ему огромная!

20180722_194617
Я и дядя Вова

Итак: Скоро сказка сказывается , да не скоро дело делается. Подъезжаем к Актобе, я звоню братишке, что бы он меня встретил. Фура не газель, по городу кататься не будет. Ок. Приехали, байк разгрузили и на эвакуаторе довезли до СТО братишки (он ГБО на машины ставит)

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

Сам же я покупаю билет на поезд на последний день отпуска и ухожу в Нирвану. 

Ибо с байком были планы махнуть в Оренбург, но им не суждено было исполниться.

Ходил по гостям, и пил водку. Это не интересно никому. Но время провел хорошо.

20180729_011757
Ночной Актобе

За три дня до окончания отпуска байк был готов. Ура товарищи!!!

Как раз один день на обкатку. Второй на регулировку, и все. Сдаю билет и в путь.

Обратная дорога мало чем отличается. До Костаная шел 12 часов из за Денисовки.

Уже на расслабленном аморте и с 5 л. запасного бензина мот рулился куда охотнее. Ямы объезжались легче, а мелкие хорошо глотались подвеской. 

С Костаная до Астаны дошел за 8.5 часов. Средняя скорость получается с учетом всех остановок около 80-85 км/ч.

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

Хотя по приезду чез часа 3 в Астане зарядил мелкий такой противный дождик, и я рад, что приехал до его начала.

Вот такой вот мой первый мототрип. Мне очень понравилось, но есть пару вещей, которые я еще учту. Ну и турэндуро нужно для наших дорог. Даже асфальтовых.

Актюбинская область
Граница Актюбинской и Костанайской областей. Байк готов ехать дальше
Только бы не дождь
С опаской смотрю на небосвод
Лишь бы дождя небыло. Или хотя бы после плохого участка дороги

Восстановление забытого пароля из Remmina

  1. Скопировать значение secret из файла ~/.remmina/remmina.pref
  2. Скопируйте пароль из файла настроек. ~/.remmina/xxxx.remmina
    Найти файл настроек нужного сервера : grep 192.168.0.2 ~/.remmina/*
  3. Создайте файл со следующим содержимым
    #!/usr/bin/python
    from Crypto.Cipher import DES3
    import base64
    secret = base64.decodestring(‘КЛЮЧ ИЗ ШАГА 1)
    key = secret[:24]
    iv = secret[24:]
    # Encoded Encrypted password
    EEpwd = ‘ШИФРОВАННЫЙ ПАРОЛЬ ИЗ ШАГА 2’
    # Decoded Encrypted password
    DEpwd = base64.decodestring(EEpwd)
    # Decoded Decrypted password
    DDpwd = DES3.new(key, DES3.MODE_CBC, iv).decrypt(DEpwd)
    print «Decoded (Decrypted ( PWD ) ) : «,DDpwd
    
    

    Colored with dumpz.org

  4. Сделайте файл исполняемым chmod +x ИМЯ_СКРИПТА
  5. Запустите скрипт ./ИМЯ_СКРИПТА и сохраните пароль

Динамическое изменение размеров панелей (управление видимостью)

Видимость = НЕ Видимость;
Если Видимость Тогда
	//если нужно показать текущую панель
	//Привяжем верхнюю границу следующей панели к нижней границе разделителя
	ЭлементыФормы.ПанельВопроса2.УстановитьПривязку(ГраницаЭлементаУправления.Верх,ЭлементыФормы.Р1, ГраницаЭлементаУправления.Низ);
	//Развернем текущую панель и разделитель
	ЭлементыФормы.ПанельВопроса1.Свертка = РежимСверткиЭлементаУправления.Нет;
	ЭлементыФормы.Р1.Свертка = РежимСверткиЭлементаУправления.Нет;
	//Привяжем нижнюю границу текущей панели к верхней границе разделителя
	ЭлементыФормы.ПанельВопроса1.УстановитьПривязку(ГраницаЭлементаУправления.Низ,ЭлементыФормы.Р1,ГраницаЭлементаУправления.Верх);
Иначе
	//если нужно спрятать текущую панель
	//Сбросим нижнюю привязку текущей панели
	ЭлементыФормы.ПанельВопроса1.УстановитьПривязку(ГраницаЭлементаУправления.Низ);
	//Привяжем верхнюю границу разделителя к низу текущей панели
	ЭлементыФормы.Р1.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.ПанельВопроса1, ГраницаЭлементаУправления.Низ);
	//Свернем тек. панель и разделитель
	ЭлементыФормы.ПанельВопроса1.Свертка = РежимСверткиЭлементаУправления.Верх;
	ЭлементыФормы.Р1.Свертка = РежимСверткиЭлементаУправления.Верх;
	//Привяжем верх след. панели к нижней границе разделителя
	ЭлементыФормы.ПанельВопроса2.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.Р1,ГраницаЭлементаУправления.Низ);
КонецЕсли;

Конвертация данных. Доступ к реквизитам табличной части из алгоритмов выгрузки

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

Т = СоздатьОбъект("ТаблицаЗначений");
Т.НоваяКолонка("Код");
Т.НоваяКолонка("Наименование");
Т.НоваяСтрока();
Если ОбъектКоллекции.ВидРасчета = "Оклад" Тогда
	Т.Код = "00001";
	Т.Наименование = "Оклад";	
ИначеЕсли ОбъектКоллекции.ВидРасчета = "Должностной" Тогда
	Т.Код = "00099";
	Т.Наименование = "БДО по дням";	
Иначе
	Сообщить("ПКС_ПриемНаРаботуВОрганизацию_ОсновныеНачисления_ВидРасчета_ПередВыгрузкойСвойства_20_25","");
	Сообщить("Не предусмотренный вид расчета """+Источник.ОсновныеНачисления.ВидРасчета+""". Проверьте правило.","");
	Т.Код = "00001";
КонецЕсли;
Значение = Т;

Перенос данных из базы с поврежденными таблицами

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

Однако при попытке доступа к документу «Платежный ордер списание денежных средств» база вылетает с ошибкой.

Ошибка СУБД:
Ошибка SQL: Таблица не найдена '_Document151_VT3126'
по причине:
Ошибка SQL: Таблица не найдена '_Document151_VT3126'

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


Обработка переноса данных в идентичную конфигурацию не подошла, из за того, что так же вылетала с ошибкой БД.

Ниже опишу мои действия по созданию новой конфигурации.

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

Поэтому решил переносить документы вместе с движениями. Задача не замысловатая.

В режиме «Предприятие» открыл обработку MD82Exp.epf. Снял все галки и выгрузил описание метаданных в XML файл

Далее запустил конвертацию данных 2.0 и загрузил метаданные в нее.

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

Далее все просто. Создал новую конвертацию и с помощью мастера автоматический создал правила конвертации объектов

Нашел ПКО для документа «Платежный ордер списание денежных средств» и событии выгрузки «ПередВыгрузкой» написал два слова:

Отказ = Истина;

Так же с помощью мастера создал правила выгрузки данных.

Пришло время «испорченных» документов.

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

Для этого в настройках правил обмена на закладе «Алгоритмы/Запросы» создал новый запрос с именем БУ

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(БУ.Период, ДЕНЬ) КАК Дата,
	ИСТИНА КАК Активность,
	БУ.СчетДт,
	БУ.СчетКт,
	БУ.СубконтоДт1,
	БУ.СубконтоДт2,
	БУ.СубконтоДт3,
	БУ.СубконтоКт1,
	БУ.СубконтоКт2,
	БУ.СубконтоКт3,
	БУ.Организация,
	БУ.ВалютаДт,
	БУ.ВалютаКт,
	БУ.СтруктурноеПодразделениеДт,
	БУ.СтруктурноеПодразделениеКт,
	БУ.СуммаОборот КАК Сумма,
	БУ.ВалютнаяСуммаОборотДт КАК ВалютнаяСуммаДт,
	БУ.ВалютнаяСуммаОборотКт КАК ВалютнаяСуммаКт,
	БУ.КоличествоОборотДт КАК КоличествоДт,
	БУ.КоличествоОборотКт КАК КоличествоКт
ИЗ
	РегистрБухгалтерии.Типовой.ОборотыДтКт(, , Регистратор, , , СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Типовой.ДенежныеСредстваНаТекущихБанковскихСчетах), , ) КАК БУ
ГДЕ
	ТИПЗНАЧЕНИЯ(БУ.Регистратор) = ТИП(Документ.ПлатежныйОрдерСписаниеДенежныхСредств)

УПОРЯДОЧИТЬ ПО
	БУ.Период

т.е. «вытащил» все проводки документа «ПлатежныйОрдерСписаниеДенежныхСредств». Периодичность «Регистратор» нужна для того, что бы можно было поставить отбор на его тип.

Аналогично создал запрос НУ, который получает данные из налогового учета.

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

УПОРЯДОЧИТЬ ПО
	НУ.Период

Создал новое ПКО, где объект источник — пустое значение, а объект приемник — документ ОперацияБух. Назвал его ОперацияБухПО.
Правила конвертации свойств для него так же заполнил автоматически.

Создал в ручную ПравилоВыгрузкиДанных со следующими настройками

Объект выборки: Не указан
Способ выборки: Произвольный алгоритм
Правило конвертации: ОперацияБухПО.

Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОсновнаяОрганизация");
БУ = Запросы.БУ.Выполнить().Выгрузить();
НУ = Запросы.НУ.Выполнить().Выгрузить();

Операции = БУ.Скопировать(,"Дата");
Операции.Свернуть("Дата");
Операции.Колонки.Добавить("Номер");
Операции.Колонки.Добавить("ПометкаУдаления");
Операции.Колонки.Добавить("Организация");
Операции.Колонки.Добавить("Автор");
Операции.Колонки.Добавить("Комментарий");
Операции.Колонки.Добавить("Ответственный");
Операции.Колонки.Добавить("Содержание");
Операции.Колонки.Добавить("СтруктурноеПодразделение");
Операции.Колонки.Добавить("ТиповаяОперация");
Операции.Колонки.Добавить("СуммаОперации");

Операции.Колонки.Добавить("Типовой");
Операции.Колонки.Добавить("Налоговый");
Операции.Колонки.Добавить("ЗапрашиваемыеПараметры");

Типовой = Неопределено;
Налоговый = Неопределено;	
ЗапрашиваемыеПараметры = Неопределено;

Выполнить(Алгоритмы.ПодготовитьТаблицыПроводок);

Год = 0;
СЦ = 0;
Для Каждого Операция ИЗ Операции Цикл
	Если Год <> Год(Операция.Дата) Тогда
		Год = Год(Операция.Дата);СЦ = 0;
	КонецЕсли;
	СЦ = СЦ+1;
	Операция.Номер = ПривестиНомерКДлине(Строка(СЦ),11,,"ПО-");
	Операция.ПометкаУдаления = ЛОЖЬ;
	Операция.ТиповаяОперация = Справочники.ТиповыеОперации.ПустаяСсылка();
	Операция.Организация = Организация;
	Операция.Комментарий = "Перенос проводок списания денежных средств за "+Формат(Операция.Дата,"ДФ='dd MMMM yyyy'");
	Операция.Автор = глТекущийПользователь;
	Операция.Ответственный = глТекущийПользователь;
	Операция.Содержание = Операция.Комментарий;
	//
	Операция.Типовой = Типовой.СкопироватьКолонки();
	Операция.Налоговый = Налоговый.СкопироватьКолонки();
	Операция.ЗапрашиваемыеПараметры = ЗапрашиваемыеПараметры.СкопироватьКолонки();
	Строки = БУ.НайтиСтроки(Новый Структура("Дата", Операция.Дата));
	
	СуммаОперации = 0;
	ТЧ = Операция.Типовой;
	Выполнить(Алгоритмы.ПолучитьПроводки);
	Операция.СуммаОперации = СуммаОперации;
	Строки = НУ.НайтиСтроки(Новый Структура("Дата", Операция.Дата));
	ТЧ = Операция.Налоговый;
	Выполнить(Алгоритмы.ПолучитьПроводки);
КонецЦикла;

ВыборкаДанных = Операции;

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

//ПодготовитьТаблицыПроводок
Типовой = Новый ТаблицаЗначений;
Типовой.Колонки.Добавить("Активность");
Типовой.Колонки.Добавить("ВалютаДт");
Типовой.Колонки.Добавить("ВалютаКт");
Типовой.Колонки.Добавить("ВалютнаяСуммаДт");
Типовой.Колонки.Добавить("ВалютнаяСуммаКт");
Типовой.Колонки.Добавить("ВидРегламентнойОперации");
Типовой.Колонки.Добавить("КоличествоДт");
Типовой.Колонки.Добавить("КоличествоКт");
Типовой.Колонки.Добавить("НомерЖурнала");
Типовой.Колонки.Добавить("Организация");
Типовой.Колонки.Добавить("Период");
Типовой.Колонки.Добавить("Регистратор");
Типовой.Колонки.Добавить("Содержание");
Типовой.Колонки.Добавить("СтруктурноеПодразделениеДт");
Типовой.Колонки.Добавить("СтруктурноеПодразделениеКт");
Типовой.Колонки.Добавить("СубконтоДт");
Типовой.Колонки.Добавить("СубконтоКт");
Типовой.Колонки.Добавить("Сумма");
Типовой.Колонки.Добавить("СчетДт");
Типовой.Колонки.Добавить("СчетКт");
Налоговый = Новый ТаблицаЗначений;
Налоговый.Колонки.Добавить("Активность");
Налоговый.Колонки.Добавить("ВидРегламентнойОперации");
Налоговый.Колонки.Добавить("ВидУчетаДт");
Налоговый.Колонки.Добавить("ВидУчетаКт");
Налоговый.Колонки.Добавить("КоличествоДт");
Налоговый.Колонки.Добавить("КоличествоКт");
Налоговый.Колонки.Добавить("НомерЖурнала");
Налоговый.Колонки.Добавить("Организация");
Налоговый.Колонки.Добавить("Период");
Налоговый.Колонки.Добавить("Регистратор");
Налоговый.Колонки.Добавить("Содержание");
Налоговый.Колонки.Добавить("СтруктурноеПодразделениеДт");
Налоговый.Колонки.Добавить("СтруктурноеПодразделениеКт");
Налоговый.Колонки.Добавить("СубконтоДт");
Налоговый.Колонки.Добавить("СубконтоКт");
Налоговый.Колонки.Добавить("Сумма");
Налоговый.Колонки.Добавить("СчетДт");
Налоговый.Колонки.Добавить("СчетКт");
ЗапрашиваемыеПараметры = Новый ТаблицаЗначений;
ЗапрашиваемыеПараметры.Колонки.Добавить("Значение");
ЗапрашиваемыеПараметры.Колонки.Добавить("Имя");
ЗапрашиваемыеПараметры.Колонки.Добавить("Представление");
//ПолучитьПроводки
Для Каждого Проводка ИЗ Строки Цикл
	СуммаОперации = СуммаОперации + Проводка.Сумма;
	стрТЧ = ТЧ.Добавить();
	ЗаполнитьЗначенияСвойств(стрТЧ, Проводка);
	стрТЧ.Период = КонецДня(Проводка.Дата);
	стрТЧ.СубконтоДт = Новый Соответствие;
	Если Проводка.СчетДт.ВидыСубконто.Количество() > 0 Тогда
		стрТЧ.СубконтоДт.Вставить(Проводка.СчетДт.ВидыСубконто[0].ВидСубконто, Проводка.СубконтоДт1);
	КонецЕсли;
	Если Проводка.СчетДт.ВидыСубконто.Количество() > 1 Тогда
		стрТЧ.СубконтоДт.Вставить(Проводка.СчетДт.ВидыСубконто[1].ВидСубконто, Проводка.СубконтоДт2);
	КонецЕсли;
	Если Проводка.СчетДт.ВидыСубконто.Количество() > 2 Тогда
		стрТЧ.СубконтоДт.Вставить(Проводка.СчетДт.ВидыСубконто[2].ВидСубконто, Проводка.СубконтоДт3);
	КонецЕсли;
	стрТЧ.СубконтоКт = Новый Соответствие;
	Если Проводка.СчетКт.ВидыСубконто.Количество() > 0 Тогда
		стрТЧ.СубконтоКт.Вставить(Проводка.СчетКт.ВидыСубконто[0].ВидСубконто, Проводка.СубконтоКт1);
	КонецЕсли;
	Если Проводка.СчетКт.ВидыСубконто.Количество() > 1 Тогда
		стрТЧ.СубконтоКт.Вставить(Проводка.СчетКт.ВидыСубконто[1].ВидСубконто, Проводка.СубконтоКт2);
	КонецЕсли;
	Если Проводка.СчетКт.ВидыСубконто.Количество() > 2 Тогда
		стрТЧ.СубконтоКт.Вставить(Проводка.СчетКт.ВидыСубконто[2].ВидСубконто, Проводка.СубконтоКт3);
	КонецЕсли;
КонецЦикла;

Алгоритм «ПодготовитьТаблицыПроводок» просто создает нужные ТЗ
Алгоритм «ПолучитьПроводки» заполняет аналитику.

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

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

По согласованию с заказчиком было решено перенести лишь входящие остатки на начало года. Для этого создал новый запрос ОСВ_БУ

ВЫБРАТЬ
     &ДатаОкончания КАК Дата,
	БУ.Счет КАК Счет,
	ИСТИНА КАК Активность,
	ВЫБОР  КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Счет
			ИНАЧЕ &Счет0  КОНЕЦ КАК СчетДт,
	ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Счет
			ИНАЧЕ &Счет0 КОНЕЦ КАК СчетКт,
	ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Субконто1
			ИНАЧЕ NULL КОНЕЦ КАК СубконтоДт1,
	ВЫБОР КОГДА БУ.Счет.Вид = &Активный  ТОГДА БУ.Субконто2
			ИНАЧЕ NULL КОНЕЦ КАК СубконтоДт2,
	ВЫБОР КОГДА БУ.Счет.Вид = &Активный  ТОГДА БУ.Субконто3
			ИНАЧЕ NULL КОНЕЦ КАК СубконтоДт3,
	ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Субконто1
			ИНАЧЕ NULL  КОНЕЦ КАК СубконтоКт1,
	ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный  ТОГДА БУ.Субконто2
			ИНАЧЕ NULL КОНЕЦ КАК СубконтоКт2,
	ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Субконто3
			ИНАЧЕ NULL КОНЕЦ КАК СубконтоКт3,
	ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.Валюта
			ИНАЧЕ NULL КОНЕЦ КАК ВалютаДт,
	ВЫБОР КОГДА БУ.Счет.Вид = &Пассивный ТОГДА БУ.Валюта
			ИНАЧЕ NULL КОНЕЦ КАК ВалютаКт,
	ВЫБОР КОГДА БУ.Счет.Вид = &Активный ТОГДА БУ.СуммаОстатокДт
			ИНАЧЕ БУ.СуммаОстатокКт КОНЕЦ КАК Сумма,
	БУ.Организация,
	БУ.СтруктурноеПодразделение КАК СтруктурноеПодразделениеДт,
	БУ.СтруктурноеПодразделение КАК СтруктурноеПодразделениеКт,
	БУ.ВалютнаяСуммаОстатокДт КАК ВалютнаяСуммаДт,
	БУ.ВалютнаяСуммаОстатокКт КАК ВалютнаяСуммаКт,
	БУ.КоличествоОстатокДт КАК КоличествоДт,
	БУ.КоличествоОстатокКт КАК КоличествоКт
ИЗ
	РегистрБухгалтерии.Типовой.Остатки(&ДатаОкончания, , , ) КАК БУ
УПОРЯДОЧИТЬ ПО
	БУ.Счет.Код

который получает остатки по всем счетам. Создал правило правило выгрузки данных «Перенос ОСВ», так же по произвольному алгоритму. И указал для него следующий текст.

Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОсновнаяОрганизация");
Запросы.ОСВ_БУ.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запросы.ОСВ_БУ.УстановитьПараметр("Счет0", ПланыСчетов.Типовой.Вспомогательный);
Запросы.ОСВ_БУ.УстановитьПараметр("Активный", ВидСчета.Активный);
Запросы.ОСВ_БУ.УстановитьПараметр("Пассивный", ВидСчета.Пассивный);

БУ = Запросы.ОСВ_БУ.Выполнить().Выгрузить();

Операции = БУ.Скопировать(,"Счет");
Операции.Свернуть("Счет");
Операции.Колонки.Добавить("Дата");
Операции.Колонки.Добавить("Номер");
Операции.Колонки.Добавить("ПометкаУдаления");
Операции.Колонки.Добавить("Организация");
Операции.Колонки.Добавить("Автор");
Операции.Колонки.Добавить("Комментарий");
Операции.Колонки.Добавить("Ответственный");
Операции.Колонки.Добавить("Содержание");
Операции.Колонки.Добавить("СтруктурноеПодразделение");
Операции.Колонки.Добавить("ТиповаяОперация");
Операции.Колонки.Добавить("СуммаОперации");

Операции.Колонки.Добавить("Типовой");
Операции.Колонки.Добавить("Налоговый");
Операции.Колонки.Добавить("ЗапрашиваемыеПараметры");

Типовой = Неопределено;
Налоговый = Неопределено;	
ЗапрашиваемыеПараметры = Неопределено;

Выполнить(Алгоритмы.ПодготовитьТаблицыПроводок);
СЦ = 0;
Для Каждого Операция ИЗ Операции Цикл
	СЦ = СЦ + 1;
	Операция.Номер = ПривестиНомерКДлине(Строка(СЦ),11,,"ОСВ-");
	Операция.Дата = ДатаОкончания;
	Операция.ПометкаУдаления = ЛОЖЬ;
	Операция.ТиповаяОперация = Справочники.ТиповыеОперации.ПустаяСсылка();
	Операция.Организация = Организация;
	Операция.Автор = глТекущийПользователь;
	Операция.Комментарий = "Перенос остатов по счету БУ "+Операция.Счет;
	Операция.Содержание = Операция.Комментарий;

	Операция.Типовой = Типовой.СкопироватьКолонки();
	Операция.Налоговый = Налоговый.СкопироватьКолонки();
	Операция.ЗапрашиваемыеПараметры = ЗапрашиваемыеПараметры.СкопироватьКолонки();
	
	Строки = БУ.НайтиСтроки(Новый Структура("Счет", Операция.Счет));
	ТЧ = Операция.Типовой;
	СуммаОперации = 0;
	Выполнить(Алгоритмы.ПолучитьПроводки);
	Операция.СуммаОперации = СуммаОперации;
КонецЦикла;

ВыборкаДанных = Операции;

После этого данные бух. учета у меня сели нормально.

Остались регистры накопления.

Начну с правила выгрузки данных. т.к. ПКО зависит него.
Назвал из «ОстаткиРегистрыНакопления». Они так же выгружаются по произвольному алгоритму
Событие «ПередВыгрузкой» содержит следующий код:

ВыборкаДанных = Новый ТаблицаЗначений;
ВыборкаДанных.Колонки.Добавить("Автор");
ВыборкаДанных.Колонки.Добавить("Комментарий");
ВыборкаДанных.Колонки.Добавить("Организация");
ВыборкаДанных.Колонки.Добавить("Ответственный");
ВыборкаДанных.Колонки.Добавить("Дата");
ВыборкаДанных.Колонки.Добавить("Номер");
ВыборкаДанных.Колонки.Добавить("ТаблицаРегистровНакопления");

Запрос = Новый Запрос;
Имена = Новый Структура;

Запрос.УстановитьПараметр("Дата", ДатаОкончания+1);

Для Каждого Рег ИЗ Метаданные.РегистрыНакопления Цикл
	Если Рег.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда
		Продолжить;			
	КонецЕсли;
	
	Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрНакопления."+Рег.Имя+".Остатки(&Дата)";
	Результат = Запрос.Выполнить();
	Если НЕ Результат.Пустой() Тогда
		Поля = "";
		Для Каждого Изм ИЗ Рег.Измерения Цикл
			Поля = Поля + Изм.Имя+",";
		КонецЦикла;
		Для Каждого Рес ИЗ Рег.Ресурсы Цикл
			Поля = Поля + Рес.Имя+"Остаток КАК "+Рес.Имя+",";
		КонецЦикла;
		
		Поля = Лев(Поля,СтрДлина(Поля)-1);
		Имена.Вставить(Рег.Имя,Поля);
		ВыборкаДанных.Колонки.Добавить(Рег.Имя);
	КонецЕсли;
КонецЦикла;

Стр = ВыборкаДанных.Добавить();
Стр.ТаблицаРегистровНакопления = Новый ТаблицаЗначений;
Стр.ТаблицаРегистровНакопления.Колонки.Добавить("Имя");
Стр.ТаблицаРегистровНакопления.Колонки.Добавить("Представление");

Для Каждого КиЗ ИЗ Имена Цикл
	сРг = Стр.ТаблицаРегистровНакопления.Добавить();
	сРг.Имя = КиЗ.Ключ;
	сРг.Представление = Метаданные.РегистрыНакопления[КиЗ.Ключ].Синоним;
	
	Запрос.Текст = "ВЫБРАТЬ ИСТИНА КАК Активность,
					|"+КиЗ.Значение+"
					|ИЗ РегистрНакопления."+КиЗ.Ключ+".Остатки(&Дата)";
					
	Стр[Киз.Ключ] = Запрос.Выполнить().Выгрузить();
	Стр[Киз.Ключ].Колонки.Добавить("ВидДвижения");
	Стр[Киз.Ключ].Колонки.Добавить("Период");
	Стр[Киз.Ключ].Колонки.Добавить("Регистратор");
	Стр[Киз.Ключ].ЗаполнитьЗначения(ВидДвиженияНакопления.Приход,"ВидДвижения");
	Стр[Киз.Ключ].ЗаполнитьЗначения(ДатаОкончания,"Период");
КонецЦикла;

Стр.Номер = "ОР-00000001";
Стр.Дата = ДатаОкончания;
Стр.Автор = глТекущийПользователь;
Стр.Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь,"ОсновнаяОрганизация");
Стр.Комментарий = "Перенос остатков регистров накопления";
Стр.Ответственный = глТекущийПользователь;

т.е. у меня выгружаются только те регистры, которые имеют остатки.

Проверил в режиме «предприятие» эту обработку, и посмотрел, какие регистры имеют остатки.

Создал ПКО для документ «КорректировкаЗаписейРегистров». В нем объект источник так же не указан.

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

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

Получилось что то типа такого

На этом настройка закончилась, перенос данных отработал и все жили долго и счастливо 🙂 А базы настроили на регулярную резервную архивацию на дисках, не связанных с диском БД!!!

Получить менеджер объекта по ссылке

//Функция получает менеджер объект по ссылке на него.
Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт
    	ИмяОбъекта = Ссылка.Метаданные().Имя;
    	ТипСсылки = ТипЗнч(Ссылка);
    	Если Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
    		Возврат Справочники[ИмяОбъекта];
    	ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
    		Возврат Документы[ИмяОбъекта];
    	ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
    		Возврат БизнесПроцессы[ИмяОбъекта];
    	ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
    		Возврат ПланыВидовХарактеристик[ИмяОбъекта];
    	ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
    		Возврат ПланыСчетов[ИмяОбъекта];
    	ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
     		Возврат ПланыВидовРасчета[ИмяОбъекта];
     	ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
     		Возврат Задачи[ИмяОбъекта];
     	ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
     		Возврат ПланыОбмена[ИмяОбъекта];
     	ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
     		Возврат Перечисления[ИмяОбъекта];
     	Иначе
    		Возврат НеОпределено;
    	КонецЕсли;
 КонецФункции

Обновление (установка) Plex Media Server. Ubuntu Server

  1. Скачать установочный .deb файл со страницы загрузки
  2. Если Plex ужа был установлен, на всякий случай сделать копию папки
    $PLEX_HOME/Library/Application Support/Plex Media Server/
  3. Запустить команду установки
    plexuser@plexserver:~$ sudo dpkg -i plexmediaserver_0.9.11.7.803-87d0708_amd64.deb
  4. Все!
Пример вывода
sudo dpkg -i plexmediaserver_1.2.7.2987-1bef33a_amd64.deb
[sudo] password for ytzh: 
(Чтение базы данных … на данный момент установлен 238461 файл и каталог.)
Подготовка к распаковке plexmediaserver_1.2.7.2987-1bef33a_amd64.deb …
plexmediaserver stop/waiting
Распаковывается plexmediaserver (1.2.7.2987-1bef33a) на замену (1.1.4.2757-24ffd60) …
Настраивается пакет plexmediaserver (1.2.7.2987-1bef33a) …
plexmediaserver start/running, process 3314
Обрабатываются триггеры для mime-support (3.54ubuntu1.1) …
Обрабатываются триггеры для ureadahead (0.100.0-16) …
ureadahead will be reprofiled on next reboot