Yes, but this answer is specific to rcirc (because I personally use it). I can get rcirc to connect to my ZNC server out-of-the-box:
(setq rcirc-server-alist '(("znc-server" :nick "znc-username" :password "znc-username:znc-password" :full-name "full-name")))
As far as parting channels is concerned, simply detach before killing the buffer: issue '/quote detach [channel-name]' to the buffer before executing 'kill-buffer'. To differentiate between detaching and parting, I've bound the action of detaching + killing to 'C-c C-d' in rcirc-mode. You can get other ZNC-specific functionality by simply binding keys to the ZNC commands described here: http://en.znc.in/wiki/Using_commands
EDIT: I thought I should include the code that I use to detach.
(defun rcirc-detach-buffer ()
(interactive)
(let ((buffer (current-buffer)))
(when (and (rcirc-buffer-process)
(eq (process-status (rcirc-buffer-process)) 'open))
(with-rcirc-server-buffer
(setq rcirc-buffer-alist
(rassq-delete-all buffer rcirc-buffer-alist)))
(rcirc-update-short-buffer-names)
(if (rcirc-channel-p rcirc-target)
(rcirc-send-string (rcirc-buffer-process)
(concat "DETACH " rcirc-target))))
(setq rcirc-target nil)
(kill-buffer buffer)))
(define-key rcirc-mode-map [(control c) (control d)] 'rcirc-detach-buffer)